使用MindStudio进行FOMM模型推理
使用MindStudio对FOMM模型进行ONNX推理
本次实验使用MindStudio开发工具进行SSH远程连接、编译、开发等操作,MindStudio的安装配置请参照:
https://www.hiascend.com/document/detail/zh/mindstudio/50RC2/progressiveknowledge/index.html
MindStudio提供了AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助您在一个工具上就能高效便捷地完成AI应用开发。MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。
一、模型简介
FOMM模型最早是Aliaksandr Siarohin等人在发表的《First Order Motion Model for Image Animation》一文中提到的用于图像动画化(image animation)的模型。图像动画化任务是指给定一张原图片和一个驱动视频,通过视频合成,生成主角为原图片,而动画效果和驱动视频一样的视频。以往的视频合成往往依赖于预训练模型来提取特定于对象的表示,而这些预训练模型是使用昂贵的真实数据注释构建的,并且通常不适用于任意对象类别。而FOMM的提出很好的解决了这个问题。
FOMM主要依赖于两个模型:kp detector和generator。顾名思义,第一个模型的作用是关键点检测,第二个模型的作用是视频生成。而本次FOMM模型推理实验也是主要围绕这两个模型来进行。
本文详细介绍了在310P(昇腾显卡)和T4(nvidia显卡)两种机器上,使用MindStudio对FOMM模型进行onnx模型推理的具体步骤。
二、MindStudio项目初始化
1 新建项目
首先在Name一栏输入项目名:
然后我们需要配置项目的CANN工具包依赖。尤其是我们第一次使用MindStudio的时候,这一步是不可省略的。
选择CANN Version一栏后面的Change选项,配置我们项目的CANN工具包依赖。在该界面,首先选择我们的项目开发所使用的服务器,然后选择服务器上CANN工具包的安装路径,最后点击Finish,保存配置。
MindStudio在创建新项目这一界面为我们提供了一个昇腾APP应用Pyhton框架空工程,这能帮助我们更加方便地管理和开发我们的应用,即下图中的ACL Project(Python),我们选择这一项,点击Finish。
2 下载github源码仓
进入项目界面后在底部选择“终端”,执行如下命令:
git clone https://github.com/AliaksandrSiarohin/first-order-model.git
等待下载完成
这里为了方便,我们将下载下来的源码从first-order-model文件夹中提出来,直接放在FOMM1(我们的项目目录)下,并删除空的first-order-model文件夹。
3 配置conda环境,安装项目所需依赖
源码仓的readme建议使用pip install -r requirements.txt安装项目所需依赖。
但由于其依赖版本过低,所以此处不建议直接使用源码仓中的requirements.txt进行安装。具体依赖和版本如下:
依赖名称 | 版本 |
cloudpickle | 2.1.0 |
cycler | 0.11.0 |
dask | 2022.2.0 |
decorator | 5.1.1 |
imageio | 2.21.0 |
imageio-ffmpeg | 0.4.7 |
kiwisolver | 1.4.4 |
matplotlib | 3.3.2 |
mmcv-full | 1.5.0 |
networkx | 2.7.1 |
numpy | 1.21.5 |
onnx | 1.12.0 |
onnxruntime | 1.12.1 |
opencv-python | 4.6.0.66 |
pandas | 1.3.5 |
pillow | 9.2.0 |
pycparser | 2.21 |
pyparsing | 3.0.9 |
python | 3.7 |
pytz | 2022.1 |
pytorch | 1.11.0 |
pywavelets | 1.3.0 |
pyyaml | 6.0 |
scikit-image | 0.18.0 |
scikit-learn | 1.0.2 |
scipy | 1.7.3 |
six | 1.16.0 |
skl2onnx | 1.12 |
sympy | 1.10.1 |
toolz | 0.12.0 |
torchaudio | 0.11.0 |
torchvision | 0.12.0 |
tqdm | 4.64.0 |
其中需要注意的是,scikit-image的版本必须低于0.19.0。
另外,根据源码仓readme,需要额外从github上下载一些依赖包:
在我们的项目目录下运行如下命令:
git clone https://github.com/1adrianb/face-alignment
cd face-alignment
python setup.py install
cd ..
git clone --recursive https://github.com/AliaksandrSiarohin/pose-evaluation
git clone https://github.com/facebookresearch/maskrcnn-benchmark
cd maskrcnn-benchmark
python setup.py install
4 下载数据集
为了方便下载,这里提供了已经预处理好的taichi数据集(.mp4格式)。
https://pan.baidu.com/s/1zSDFYXwrBvCfw2NAIxQAYg
提取码:mind
下载整个taichi文件夹,将下载后的taichi文件夹放入FOMM1/data/。
三、配置远程服务器
1 添加SSH配置
点击左上角file,选择setting
在左侧选择tools,在下拉菜单中选择SSH Configurations,点击“+”
在新建的空白配置页面输入服务器ip,用户名,密码;
勾选save password保存密码;
点击test connection测试是否能连接服务器;
最后点击下面的ok配置完成。
配置好SSH服务器后回到项目界面,点击上方菜单栏中的tools,在下拉菜单中点击start SHH session,选择刚才配置好的SSH连接,即可成功连接SSH服务器,并弹出远程操作终端:
2 管理CANN工具包
如果我们在使用过程中需要更换我们所要使用的CANN工具,则可按照以下步骤更换。
首先,如下图所示,点击MindStudio界面上端的CANN manager按钮,打开CANN管理界面:
按下图所示,先在弹出的界面选择change CANN,然后在新弹出的界面选择我们使用的远程服务器:
然后如下图所示,选择服务器上CANN工具包安装的目录,我这里是/home/infname46/Ascend/ascend-toolkit/5.1.RC2,选择好后点击ok:
最后点击finish,等待部署完毕即可:
配置好后,重启MindStudio。
3 部署项目至服务器
在顶部菜单栏选择Tools,在下拉菜单中选择Deployment,再选择Configuration:
在弹出的配置页面中,首先点击“+”,输入配置名称,点击OK:
然后在右侧SSH configuration处选择项目部署的服务器,之后同样点击test Connection测试连接是否成功,然后选择Mappings配置项目映射目录:
在mapping中配置路径映射关系,配置好后点击ok提交:
最后,完成了服务器的一切配置之后,需要将项目部署到服务器上。在MindStudio项目界面,右键选择我们的项目,选择Deployment,Upload to,选择目标服务器:
文件开始上传:
最后,我们可以通过“Tools—Deployment—Automatic Upload”来设置自动部署。设置好自动部署后,每当我们在本地对程序进行修改后,按“Ctrl + S”保存,MindStudio便会自动将编辑过的文件自动上传至服务器。
4 配置远程SSH解释器
该步骤的目的是可以在本地的windows系统上使用MindStudio运行/调试在远程服务器上运行的程序。
首先点击MindStudio右上角的齿轮,在弹出的列表中选择Project Structure:
在弹出的设置界面,选择左侧菜单栏的SDK,点击“+”,选择Add Python SDK:
在弹出的界面选择SSH Interpreter;选择项目部署的服务器;选择服务器上所使用的conda虚拟环境的安装路径;最后点击OK保存配置:
5 设置项目的默认python环境
首先进入project structure界面,左侧然后左侧选择project,再project的SDK选项下选择我们要使用的python环境,具体如下图:
然后再选择project structure界面中的modules,在该界面配置modules SDK,额然后点击ok保存配置即可:
四、模型转换
1 生成onnx模型
在项目中创建以下目录:
checkpoint
taichi-onnx
taichi-onnx/oms
然后根据作者提供的链接下载所需的.pth.tar格式的模型参数文件,保存在checkpoint文件夹中。
模型参数文件的链接如下:
https://drive.google.com/open?id=1PyQJmkdCsAkOYwUyaj_l-l0as-iLDgeH
编写将.pth.tar格式的checkpoint转化为onnx模型的程序get_onnx_bs1.py,放在项目根目录下。
实现思路很简单,用源码仓提供的模型加载函数加载checkpoint模型,然后用torch.onnx.export导出onnx模型。
代码中用到的util.load_checkpoints是从项目源码中提取出来的一个函数,其主要内容见下图:
此外,因为目前onnx对某些pytorch中的算子还不支持,此项目中所涉及到的onnx不支持的算子包括:torch.inverse和torch.nn.functional.grid_sample。这两个算子需要我们用onnx支持的算子重新实现。其中inverse算子我们用自己实现的inverse_without_cat.py中的invmat函数代替;grid_sample算子用point_grid_my.py中的bilinear_grid_sample函数代替。
inverse_without_cat.py和point_grid_my.py的具体内容如下:
编辑好后将这两个程序放在项目目录下。
导出onnx之前需要对以下python文件进行修改:
将modules/dense_motion.py中的下图所示位置代码替换为:
jacobian = torch.matmul(kp_source['jacobian'], invmat(kp_driving['jacobian']))
将modules/dense_motion.py中下图所示位置的代码替换为:
sparse_deformed = bilinear_grid_sample(source_repeat, sparse_motions)
将modules/generator.py中的下图所示位置的代码替换为:
return bilinear_grid_sample(inp, deformation, align_corners=True)
修改完成后,使用onnx模型转换程序导出onnx模型。
首先我们要在MindStudio上配置get_onnx_bs1.py的运行环境,点击进入编辑配置界面:
进入编辑配置界面后,点击“+”,选择Ascend App,首先在界面上方的Name一栏输入程序名称,然后在Deployment一栏选择项目部署的配置,即我们在“第三章第3节 部署项目至服务器”中配置的服务器。
在Executable处选择get_onnx_bs1.py:
然后在Parameters一栏输入如下参数配置:
--config config/taichi-256.yaml --checkpoint checkpoint/taichi-cpk.pth.tar --outdir taichi-onnx --genname taichi-gen-bs1 --kpname taichi-kp-bs1
最后点击ok保存程序配置。这样配置好以后就可以实现在本地的MindStudio上调试远程服务器上运行的python程序了。
点击MindStudio上方工具栏的绿色三角按钮,运行该程序即可导出onnx模型。
2 onnx模型转换成om模型
首先如下图所示,点击MindStudio界面上端的model converter按钮,在弹出的界面中首先选择服务器上onnx模型的位置,然后等待模型加载完毕后,继续在target soc version一栏选择自己的昇腾服务器的芯片类型,我这里用的是Ascend310P3,最后选择om模型的输出位置,然后点next即可。
然后这里直接点next:
最后第三个页面直接点finish,开始模型转换:
稍等片刻,模型转换成功:
五、模型推理
1 配置推理环境
将aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whl下载下来,放在项目目录下,并上传至服务器。
下载链接:https://pan.baidu.com/s/1mzZhhPByVcXVeqUk9S9qNQ
提取码:mind
下载推理程序包,在本地的终端执行以下命令:
git clone https://gitee.com/ascend/tools.git
等待下载完成,然后将下载好的tools包上传至服务器(也可以直接在服务器的终端输入上条命令clone到服务器上)
然后在远程服务器终端上执行以下命令,安装aclruntime包:
pip install aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whl
(若是在普通用户下执行需要加上--user参数)
2 数据预处理
首先修改config/taichi-256.yaml,将其中dataset_params:下的root_dir:修改为data/taichi。
参考FOMM1/reconstruction.py,编写数据预处理程序如下:
然后需要修改run.py。首先将下图中所示的代码修改为:
parser.add_argument("--mode", default="train", choices=["train", "reconstruction", "animate", "pre"])
然后在run.py的最后添加代码:
elif opt.mode == 'pre':
print("pre processing...")
pre_processing(config, generator, kp_detector, opt.checkpoint, log_dir, dataset)
然后修改logger.py中下图所示的那行代码,将其改为:checkpoint = torch.load(checkpoint_path, map_location=torch.device('cpu'))
打开Run/Debug Configurations界面:
配置好run.py的mode为预处理的运行参数和环境:
点击运行run.py。等待程序执行完毕:
运行结束后在终端查看预处理后的数据的保存目录,保存结果如下所示:
3 模型推理
首先是在昇腾服务器上推理om模型:
这里为了后续使用数据方便一些我们将tools/ais-bench_workload/tool/ais_infer/ais_infer.py中下图所示位置的代码修改成:
if args.output != None:
# timestr = time.strftime("%Y_%m_%d-%H_%M_%S")
output_prefix = args.output
# os.mkdir(output_prefix, 0o755)
logger.info("output path:{}".format(output_prefix))
else:
output_prefix = None
然后我们需要配置服务器上的环境变量:
首先在服务器终端执行命令:vim ~/.bashrc
然后在文件的最后添加如下内容:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /etc/profile
然后即可开始进行模型推理。首先配置Ascend App程序:
其中Executable为:项目目录/tools/ais-bench_workload/tool/ais_infer/ais_infer.py
运行参数为:
--model /home/ltm/fomm/taichi-onnx/oms/taichi-kp-bs1.om --input /home/ltm/fomm/infer_out/d/ --output /home/ltm/fomm/infer_out/kpd/ --outfmt NPY
然后按同样的方式,再配置一个名为infer kps的运行参数为如下内容的Ascend App程序:
--model /home/ltm/fomm/taichi-onnx/oms/taichi-kp-bs1.om --input /home/ltm/fomm/infer_out/d/ --output /home/ltm/fomm/infer_out/kpd/ --outfmt NPY
配置好后点击运行按钮运行程序:
等待代码运行完毕即可。程序运行完后,下图中所标示的值便是我们测出来的性能指标:
之后,需要运行apart_kp_out.py,对推理kp模型输出的数据进行简单处理,以便之后使用。首先配置apart_kp_out.py的运行环境:
配置好后运行该程序:
待程序运行结束,即可开始gen模型的推理,同样先配置Ascend App程序:
其中Executable为:项目目录/tools/ais-bench_workload/tool/ais_infer/ais_infer.py
运行参数为:--model /home/ltm/fomm/taichi-onnx/oms/taichi-gen-bs1.om --input /home/ltm/fomm/infer_out/s/,/home/ltm/fomm/infer_out/kpdv/,/home/ltm/fomm/infer_out/kpdj/,/home/ltm/fomm/infer_out/kpsv/,/home/ltm/fomm/infer_out/kpsj/ --output /home/ltm/fomm/infer_out/out/ --outfmt NPY
配置好后点击运行,等待程序运行结束即可。
至此,在310P上推理om模型就完成了。接下来要在T4机器上推理模型,由于目前TensorRT不支持FOMM里的用到的很多算子,故此次推理使用线上推理。
首先要写一个线上推理用的python程序:
推理程序的实现思路很简单,用python的time包记录模型从输入到输出所花费的平均时间然后把平均时间代到性能的计算公式里即可。这部分功能我写在online_infer.py里,其核心代码如下:
然后修改run.py,首先修改其下图中所示的代码:
将这句修改为:parser.add_argument("--mode", default="train", choices=["train", "reconstruction", "animate", "pre", "infer", "ori_re"])
然后在最后加上如下代码:
elif opt.mode == 'infer':
print("Infer ...")
infer(config, generator, kp_detector, opt.checkpoint, log_dir, dataset)
改好后,进入运行配置界面,配置推理程序:
配置好后运行该程序,等待程序运行结束即可:
程序运行结果如下:
4 精度测试
此处需要对源码中的FOMM1/reconstruction.py进行较大修改:
然后配置run.py的mode为reconstruction的运行参数的环境:
然后点击运行,运行run.py,等待程序运行结束:
Reconstruction的结果保存在./checkpoint/reconstruction/下:
然后配置pose-evaluation/extract.py的两个运行环境,如下所示:
其中参数为:
--in_folder ../data/taichi/test/ --out_file out/akd_gt.pkl --is_video --type body_pose --image_shape 256,256
和
--in_folder ../checkpoint/reconstruction/png/ --out_file out/akd_gen.pkl --is_video --type body_pose --image_shape 256,256
配置好后依次运行两个程序:
等待程序运行完毕。
两个程序运行结束后,分别可以得到一个.pkl格式的文件,最后,配置精度计算的程序:
然后运行该程序,即可得到FOMM模型的精度指标:
至此,一整个FOMM模型推理过程就结束了
六、其他问题
如果在开发过程中遇到其他问题或者是不明白的地方,我们可以登录昇腾官方论坛进行求助。昇腾论坛链接如下:
https://bbs.huaweicloud.com/forum/forum-945-1.html
在这里,我们可以找到很多经验帖、总结帖,亦可以在昇腾论坛发帖求助技术人员,帮助我们解决问题。
七、FAQ
问题一:
转onnx模型的时候出现“Exporting the operator inverse to ONNX opset version 11 is not supported”的报错。
分析:
出现这个错误的原因是因为onnx目前还不支持Pytorch的部分算子,比如我在项目中遇到的torch.inverse和torch.nn.functional.grid_sample这两个算子,都是onnx现在还不支持的算子,如果模型中有使用到这两个算子的话,则会在转onnx模型的时候报上述的错误。
解决方法:
用onnx支持的算子实现onnx不支持的算子的功能,或者寻找替代的算子。
问题二:
使用Model Converter的时候CANN Machine一栏无法更改。
解决方法:
Model Converter界面中的CANN Machine一栏的内容无法在Model Converter界面修改,想要修改的应该点击CANN Manager,在此界面更改项目的CANN工具依赖。