目录
前言
因学习需要,想在Jetson Xavier NX(以下简称NX)上配置一个带有Pytorch环境且运行Jupyter Lab然后可以通过Web端访问的docker。
去Jetson Zoo找到了Nvidia官方发布的打包深度学习环境的docker镜像l4t-ml,准备拿来写个dockerfile打包安装上自己用的库。
这个过程中遇到了许多百度听了没听过,Google听了都懵圈的问题了。国内Jetson相关的开发资源也缺乏,所以我在优快云上发个帖子帮助一下遇到一样问题的开发者们。
问题
因为之前开发ROS2,我的NX上跑的是JetPack 5.0.2 (L4T R35.1.0)。按Nvidia官方的容器教程拉取镜像然后进行后台启动(-d)。
官方给的指南中,Jupyter Lab的默认密码是nvidia。启动没有报错,但是跑去浏览器那个页面要登录的时候就不好使了。
百度了一下关键词(l4t-ml jupyter 密码),出来的牛头不对马嘴。感觉国内很少有用这套平台开发的人。
那不行去Google一下吧,Google只找到了一个有关的结果,是英伟达开发者论坛上有人提出的这个问题 帖子链接 ,他也是用的这个版本的容器。
所以我猜测之前版本的容器中这个nvidia密码可能是正确的,而到了L4T-ML:r35.1.0-py3版本的镜像中,开发人员在合并代码时把这个密码弄炸了。
一开始我想着用连接进去容器终端,用jupyter notebook password修改密码,修改完之后进入Web端还是报错。
那我用-v把密码配置文件在容器启动的时候挂进去呢?
还是不好使,这时我怀疑里面配置好的Jupyter Lab压根不加载配置文件。
解决
土方法
jupyter server list
这是Web端提示的方法,也是英伟达开发者论坛帖子中官方人员推荐的解决方式,即通过终端获取当前启动的Jupyter Lab的token进行登录。
这种方法使用起来有点复杂,而且我想直接将这个Jupyter Lab的页面作为一个跳转按钮嵌入到自己写的前端页面中,在每次启动后去终端获取token显然是一件很繁琐的事情。
自己研究的方法(推荐)
通过研究l4t-ml这个镜像构建时候的层(layer),可以发现最后构建的一层是一句CMD命令,通过这句CMD命令在容器启动时将Jupyter Lab启动在localhost的8888端口。
这意味着可以通过在启动容器时在docker run命令后面加上需要执行的命令来替代掉默认执行的命令。
话不多说,上启动命令:
sudo docker run -d \
--runtime nvidia \
--network host \
--name lee-mldocker \
nvcr.io/nvidia/l4t-ml:r35.1.0-py3 \
jupyter lab \
--port=8888 \
--ip=0.0.0.0 \
--no-browser \
--allow-root \
--NotebookApp.password='argon2:$argon2id$v=19$m=10240,t=10,p=8$fwreAwNmSZc80PUh4Pb8zw$3EogugQsH+28ju/FhBsnyUDTt0AYWAEYvsRoaFLTITQ'
在官方教程中的docker run语句之后加入启动指令(我的指令中将指定启动密码为“1”,可以使用网上的方法调用ipython的命令对新密码使用argon2加密然后替换进去命令),同时将-it换成-d,即可创建一个在后台持续运行的容器。
运行容器,Web端输入密码“1”并回车,芜湖起飞。
sudo docker exec -it lee-mldocker bash
需要连接到容器终端时使用这个命令即可连接到容器的终端进行调试。
后记
这样就解决了英伟达官方的容器中Jupyter Lab的Web端不可用的问题,咱就是说老黄能不能对边缘计算开发的套件弄的好用一些。
Jetson系列因为CUDA加速的原因可谓是一家独大,许多成熟的AI模型部署在边缘都需要老黄家的玩意。但一家独大不是在系统上不上心的理由,在这块ARM64平台上进行开发并不友善,官方的L4T系统版本就够复杂的,一旦需要用到docker来深度学习就更是难上加难,许许多多的问题不仅仅在中文互联网很难找到解决方案,就连Google上的讨论都是少之又少。