美文网首页
NVVL工具踩坑

NVVL工具踩坑

作者: 黑恶歌王 | 来源:发表于2018-11-27 16:31 被阅读0次

    新工作

    又要开始一项新的工作....哎..师兄不知道是真的再看还是在放大话,一个星期编译好工具之后说2天要把3D-ResNet-pytorch那边实现端到端的替换...有一点仓促了...函数都没看懂的情况下直接硬套有些勉强.

    NVVL

    这里说一下NVVL工具是NVIDIA开发一个专门用来处理video的工具,官方给的github代码https://github.com/NVIDIA/nvvl.git链接就在这里了,看了一下更新时间还不到一年,发觉自己作为初学者真的是一开始就学了全新的东西.....没有教程没有指导全程靠自己进行摸索...仿佛又回到了考研那个时候..也是自己每天跟自己对付着过,自己弄自己的事情,回去后宿舍里乃至吃饭的时候还要接受舍友的冷嘲热讽之类的..嘛,不过这都过来了,扯远了.现在毕竟是稍微上了一个新台阶了,需要自己弄些东西是值得的.

    NVVL编译

    这一块实际上师兄大概是吸取了我踩坑的经验,因为他之前执意要用1.0版本的pytorch,并且source源码来编译以便日后好修改自己的模块,这一点没什么问题.经过我操作后遇到的问题如下:

    CMakeFiles/cmTC_a0531.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_a0531.dir/main.cu.o' failed
    

    遇到这个问题的解决方式查到先给gcc降级看看,待验证,然而我降级之后直接爆炸了,cmake找不到一个简单的测试程序,就非常的头疼..不知道哪里招惹了.
    安装的话按readme的手册来进行把后面
    makefile:126错误开始查找
    换了另一种方法进行安装,这是另一个工程叫做pynvvl说直接加载好的pytorch的工程接口的nvvl部分.
    pip install pynvvl-cuda80
    然后之后测试一个程序得到的错误是:
    Number of frames: 2568
    terminate called after throwing an instance of 'std::runtime_error'
    what(): 0: I give up, I can't get it to seek to frame 0
    已放弃 (核心已转储)
    一开始经过中间的测试过程发现是计算机运算能力不行...没有办法开始从服务器上进行编辑....
    后来发现问题应该是stack_size空间限制过多,这样查阅后用下面命令先查看stack_size:

    ulimit -a
    

    之后再用下一步

    ulimit -S -s unlimited
    

    将限制解除,后果是有可能会崩.不过暂无他法.
    发现有一点是可以在一个已经编译好的pytorch环境下套入nvvl的模块,这样的话省事多了.于是再次进行下一步工作.
    python setup.py install 这一步进行中.
    最后我建议师兄降低torch版本,然后cd到pytorch环境中进行编译.
    然后在我本机开始转换了环境,重新添加新环境后发现还是出问题,说是/usr/bin/cc找不到对应文件.
    于是我本机就炸了,这个问题去github那边工程也没找到相关问题.不过好在师兄弄好了环境,也算是自己没白做吧.

    关于师兄如何完成的编译过程

    或许是了解到1.0版本确实无法完成接口对接吧,师兄最后还是用了0.4版本的pytorch框架来对接nvvl工具.编译也就很轻松的先编译pytorch源码.(具体参考官方文档https://github.com/pytorch/pytorch进行编译.)NVVL直接进到pytorch子文件架去对接pytorch接口即可.

    python setup.py install
    

    不出意外安完必备组件后在对应文件夹重复这两步就可以的完成pytorch 以及nvvl的编译.

    NVVL测试问题

    然而,在测试benchmark.py的时候,提示缺少lintel包,这个包用pip是安不了的,因为他也是一个专门用于视频处理的包,经百度谷歌无效后于是乎我便从github上这么不经意一打,就出来了.这个是他们工程的链接:https://github.com/dukebw/lintel.
    啊,对了,这里有一点,lintel只支持python3.6以及以上版本...师兄之前是基于python3.5和cuda9.0与cudnn7进行编译的.于是我又重新编译了一遍.由于有了经验于是很快完成了这个任务.下面就要开始测试benchmark.py了.
    benchmark.py中间加了一些断点测试程序如下:

    from __future__ import print_function
    import argparse
    from glob import glob
    import os
    import sys
    import time
    import torch
    import nvvl
    import psutil
    
    from dataloading.dataloaders import get_loader
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--root', type=str, required=True,
            help='folder of mp4/png files')
    parser.add_argument('--sleep', type=float, required=True,
            help='dummy computation time')
    parser.add_argument('--loader', type=str, required=True,
            help='dataloader: pytorch/NVVL/lintel')
    parser.add_argument('--batchsize', type=int, default=8,
            help='batch size loaded')
    parser.add_argument('--frames', type=int, default=3,
            help='number of frames in each loaded sequence')
    parser.add_argument('--is_cropped', action='store_true',
            help='crop input frames?')
    parser.add_argument('--crop_size', type=int, nargs='+', default=[-1, -1],
            help='[height, width] for input crop')
    parser.add_argument('--fp16', action='store_true',
            help='load data in fp16?')
    
    def main(args):
    
        assert args.sleep >= 0.0, print('Computation time must be >=0.0s')
        print(str(args) + '\n')
    
        loader, batches = get_loader(args)
        print('loader:= ',loader)
        counter = 0
        data_time_sum = 0
        iter_time_sum = 0
        cpu_sum = 0
        mem_sum = 0
        i=0
        x=0
    
        for epoch in range(2):
    
            start = time.time()
            print("start_time",start)
            if args.loader != 'NVVL':
                    x = x.cuda()
                    if args.fp16:
                        x = x.half()
    
            if epoch > 0:
                    counter += 1
                    end = time.time()
                    print("end time=",time)
                    data_t = end-start
                    if args.sleep > 0.0:
                        time.sleep(args.sleep)
                    end = time.time()
                    iter_t = end-start
                    data_time_sum += data_t
                    iter_time_sum += iter_t
                    c = psutil.cpu_percent()
                    cpu_sum += c
                    m = psutil.virtual_memory().percent
                    mem_sum += m
                    start = time.time()
        data_time_ave = data_time_sum / counter
        print('data_time_ave',data_time_ave)
        iter_time_ave = iter_time_sum / counter
        print('iter_time_ave',iter_time_ave)
        cpu_ave = cpu_sum / counter
        mem_ave = mem_sum / counter
        print("Data loading time avg, iteration time avg, cpu load avg, memory usage avg")
        print("%.5f %.5f %.2f %.2f" % (data_time_ave, iter_time_ave, cpu_ave, mem_ave))
    
    if __name__=='__main__':
        main(parser.parse_args())
    

    这个程序需要三个必要参数,--root,--sleep,--loader,懂程序的各位大概也能看的出来具体是怎么个操作过程.第一个是你存视频或者图像的路径,第二个是sleep时间,详情见time的package里有讲.第三个loader选择加载模块,可选项pytorch,lintel和NVVL.
    这些都不多赘述,总之这么一弄benchmark还是卡住...啊,没有任何教程师兄来一句你加油的感觉有谁能理解.
    话是这么讲,该干的还得干哎...首先讲一讲官方说好的data处理应该是什么样的格式.
    这里我仿照C3D-tensorflow里的一个脚本完成了一个文件类型替换,这里把脚本内容贴出来吧.毕竟咱也是照葫芦画瓢,只能讲一讲其中语言具体是什么意思.如果有兴趣的话各位可以去3D-ResNet-pytorch里用里面的video转jpg那个python文件加以更改也可以.前置要求都是要有ffmpeg,这个各位装nvvl的时候肯定会装上的,这里也就不多讲了.直接上脚本:

    ###This one is for convert the video for using NVVL
    #!/bin/bash
    for folder in $1/*
    do
       for file in "$folder"/*.avi
       do 
         ffmpeg -i "$file" -map v:0 -c:v libx264 -crf 18 -pix_fmt yuv420p -g 5 -profile:v high "${file[@]%.avi}".mp4
         rm "$file"
       done
    done
    

    因为我是用来操作给ucf101数据集的,这里floder进入二级子文件夹,ucf101都是avi格式的,用ffmpeg根据官方的操作进行转码转到mp4格式,这里-g X后面可以是任意的数,只不过官方给的是5,给了一个单词叫keyframe不太理解是什么意思.希望各位大佬能给出意见,先谢过了.
    师兄直接把
    这里用python3.6+pytorch0.4+nvvl1.0进行测试,发现无法运行,只有重新切换到了python3.5版本才能跑出像师兄那样的问题.报的错误如下:

    torch.FatalError: Could not open file /mnt/8TDisk2/zsshi/3D-ResNets-PyTorch/avi/Hammering/v_Hammering_g17_c04.mp4
    
    

    师兄讲是因为读不了大数据,这一点在官方issue中尚未解决.于是我们这一步暂且一放,先进行后面的步骤.
    现在是师兄在做这一部分的后台编码,这一段工作预计今天可以得到解决,到时候分享一下这个工具的使用心得。

    未完持续

    相关文章

      网友评论

          本文标题:NVVL工具踩坑

          本文链接:https://www.haomeiwen.com/subject/xhngqqtx.html