新工作
又要开始一项新的工作....哎..师兄不知道是真的再看还是在放大话,一个星期编译好工具之后说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中尚未解决.于是我们这一步暂且一放,先进行后面的步骤.
现在是师兄在做这一部分的后台编码,这一段工作预计今天可以得到解决,到时候分享一下这个工具的使用心得。
网友评论