玩转Atlas200DK(十三)尝试MindSpore跑LeNet

十三、在Atlas 200DK上使用MindSpore训练LeNet网络

手写数字识别LeNet是深度学习最简单入门的神经网络。一般拿它来入门AI框架最合适不过了。我们来试一下,看看如何在200DK上跑LeNet:

1、下载models代码仓

git clone https://gitee.com/mindspore/models.git

2、准备MNIST数据集

cd models/official/cv/lenet

mkdir MNIST

mkdir ckpt

cd MNIST

下载MNIST数据集:

wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz

wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz

wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz

wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

按照README指定的方式解压:

gzip -d *.gz

mkdir train

mkdir test

mv train*ubyte train/

mv t10k* test/

sudo apt install tree

tree 查看目录结构:

3、训练LeNet网络

cd ..

开始训练:

python train.py --data_path=./MNIST/ --device_target="Ascend" --ckpt_path=./ckpt

报语法错误。

检查一下:

原来200DK的python缺省是Python2版本,print语句不支持 flush=True这种语法。

那就换成python3试一下:

没装yaml,那就装一下pyyaml

python3 -m pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple

这里一开始没有使用 --user,所以报权限错误,后来增加--user参数安装成功。

重新训练:

python3 train.py --data_path=./MNIST/ --device_target="Ascend" --ckpt_path=./ckpt

报错如下:

[CRITICAL] CORE(2461,fffeffff81a0,python3):2022-04-17-02:17:09.597.099 [mindspore/core/utils/ms_context.cc:130] CreateTensorPrintThread] Get acltdt handle failed
Traceback (most recent call last):
  File "train.py", line 68, in <module>
    train_lenet()
  File "/home/HwHiAiUser/models/official/cv/lenet/src/model_utils/moxing_adapter.py", line 108, in wrapped_func
    run_func(*args, **kwargs)
  File "train.py", line 48, in train_lenet
    network = LeNet5(config.num_classes)
  File "/home/HwHiAiUser/models/official/cv/lenet/src/lenet.py", line 35, in __init__
    super(LeNet5, self).__init__()
  File "/home/HwHiAiUser/.local/lib/python3.7/site-packages/mindspore/nn/cell.py", line 119, in __init__
    init_pipeline()
RuntimeError: mindspore/core/utils/ms_context.cc:130 CreateTensorPrintThread] Get acltdt handle failed

张小白发帖询问这是什么问题,专家回答道:

张小白恍然大悟。。。在Atlas 200DK上是无法进行模型训练的。

十四、在Ubuntu 18.04 X86上使用MindSpore CPU版训练LeNet网络

张小白没有在200DK上完成LeNet网络训练,这让曾经能在 树莓派4B和Jetson Nano B01完成LeNet训练的张小白感到有些失望。

不过这也挡不住张小白试验LeNet的心,既然无法在200DK上做训练,那么用开发环境ubuntu X86做LeNet训练,然后将训练好的结果送到200DK上做离线推理,应该是可以的吧?

先看下开发环境的环境:

有python3.7.5,但是没有mindspore,那就先在开发环境上安装MindSpore的CPU版本:

按照上面的选择来安装即可:

python3 -m pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.6.1/MindSpore/cpu/x86_64/mindspore-1.6.1-cp37-cp37m-linux_x86_64.whl --trusted-host http://ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple

下载mindpore的modelzoo代码仓:

准备数据集:

cd models/official/cv/lenet

mkdir MNIST

mkdir ckpt

cd MNIST

安装tree

查看数据集结构:

开始训练:

python3 train.py --data_path=./MNIST/ --device_target="CPU" --ckpt_path=./ckpt

。。。

。。。

训练结果在ckpt目录下:

执行评估:

python3 eval.py --data_path MNIST --ckpt_path ckpt/checkpoint_lenet-10_1875.ckpt --device_target="CPU"

导出MindIR模型:

python3 export.py --ckpt_file ckpt/checkpoint_lenet-10_1875.ckpt --file_format "MINDIR" --device_target="CPU"

执行完毕后,会生成一个lenet.mindir文件:

将lenet.mindir和ckpt文件拷贝到200DK上。

scp lenet.mindir HwHiAiUser@192.168.199.204:/home/HwHiAiUser/models/official/cv/lenet/

scp -r ckpt HwHiAiUser@192.168.199.204:/home/HwHiAiUser/models/official/cv/lenet/

下面来尝试使用训练好的模型在200DK上进行推理。

十五、在Atlas 200DK上编译MindSpore LeNet网络的推理代码

仔细查看了下lenet工程下scripts目录下的相关代码,其中有个run_infer_310.sh貌似就是个运行推理代码的脚本。

根据README:

直接运行试试:

bash run_infer_310.sh ../lenet.mindir ../data dvpp

报错了:

查看ascend310_infer下的build.log的日志:

确认是没有安装gflags包。

开始安装glags:

cd gflags
mkdir build
cd build

cmake .. -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DBUILD_gflags_LIB=ON

make -j8

sudo make install

再安装glog

下载代码仓:
git clone https://github.com/google/glog

cd glog
vi README.rst

根据readme进行安装:
cmake -S . -B build -G "Unix Makefiles"

cmake --build build

sudo cmake --build build --target install

回到lenet工程的ascend310_infer目录,编辑CMakeList.txt文件,增加:find_package(gflags REQUIRED):

再重新执行推理脚本:
bash ./run_infer_310.sh ../lenet.mindir ./images dvpp

仍然是build失败。
检查ascend310_infer/build.log

居然还是这个错。

这个问题折腾了张小白好几天的时间,张小白也请了 MindSpore专家 赵老师帮忙看看。最终发现 去年的一个issue的做法可以解决编译的问题:

https://gitee.com/mindspore/mindspore/issues/I3X1EA

于是如法炮制:

获取gflags安装包:
wget https://github.com/gflags/gflags/archive/v2.2.2.tar.gz --no-check-certificate

解压:
tar -zxvf v2.2.2.tar.gz

编译:
cd gflags-2.2.2/
mkdir build
cd build
export CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0
cmake .. -DBUILD_SHARED_LIBS=ON

make -j8

删除上次源码安装好的 /usr/local/lib下libgflags的包:

再make install

重新编译:

终于编译成功,但是紧接着出现了推理失败,这个咱们下一次解决吧!

十六、在Atlas 200DK上运行MindSpore LeNet网络的推理代码

书接上回:https://bbs.huaweicloud.com/blogs/349622

经过多次试验,张小白将run_infer_310.sh文件做如下修改:

(1)将python命令均改为python3,因为当前环境python指向的是Python2。

(2)在执行推理命令之前,新增 以下语句:

export LD_LIBRARY_PATH=HOME/Ascend/ascend−toolkit/5.0.4.alpha005/arm64−linux/opp/opimpl/built−in/aicore/tbe/optiling:LD_LIBRARY_PATH

. /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh

(3)将执行语句最后的 &>xx.log &去掉,将错误信息打印在屏幕上:

(4)修改http://main.cc文件,增加打印文件名的代码:

执行run_infer_310.sh命令并查看结果:

bash ./run_infer_310.sh /home/HwHiAiUser/models/official/cv/lenet/lenet.mindir /home/HwHiAiUser/models/official/cv/lenet/MNIST/test dvpp 0

。。。

虽然看到在preprocess_Result文件夹下有10000个test jpg文件。

下载下来看了下,都是手写的图片:

但是第一个文件就推理失败了!

只好又提了issue,赵老师回答了我的问题:

如法炮制:

先到X86上,编辑export.py文件:

执行export

python3 export.py --ckpt_file ckpt/checkpoint_lenet-10_1875.ckpt --file_format "MINDIR" --device_target="CPU"

可以看到新的mindir文件也已经生成:

将lenet.mindir拷贝到200DK上。

scp lenet.mindir HwHiAiUser@192.168.199.204:/home/HwHiAiUser/models/official/cv/lenet/

这个是需要注意的,如果200DK上有同名文件,会报权限错误。

那就删除掉200DK的同名文件:

再回到X86开发环境重新scp:

scp lenet.mindir HwHiAiUser@192.168.199.204:/home/HwHiAiUser/models/official/cv/lenet/

再重新执行推理:

bash ./run_infer_310.sh /home/HwHiAiUser/models/official/cv/lenet/lenet.mindir /home/HwHiAiUser/models/official/cv/lenet/MNIST/test dvpp 0

结果如下:

它会完成10000个测试图片的推理,精度结果是 0.9854.

推理结果放到了 result_Files目录下:

可见已经推理成功!

(未完待续)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小白TWO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值