当ModelArts的Notebook内置Python环境不满足项目需求时,你完全可以通过自定义IPython Kernel来切换版本或安装额外依赖,具体做法是在Notebook中打开终端,用conda创建新环境并安装ipykernel,然后执行python -m ipykernel install --user --name myenv --display-name "我的环境",刷新浏览器后即可在Kernel菜单里选中它。
很多人在ModelArts上跑深度学习任务时,会发现预置环境总差那么一点意思,要么Python版本太老,要么某个依赖包和已安装的库冲突,要么需要接入一个自定义的C扩展,这时候,与其换一个实例规格,不如花几分钟自己造一个kernel。
什么情况下需要自定义引擎
ModelArts Notebook的预置环境虽然集成了TensorFlow、PyTorch、MindSpore等主流框架,但版本是固定的,比如内置环境用的是Python 3.7,而你的代码需要Python 3.9的语法特性;或者你想安装一个针对特定硬件优化的包,却和内置的numpy版本冲突,这些场景下,内置引擎就成了限制项。
如果你经常调整ModelArts Notebook环境配置,自定义kernel的价值就更明显了,不用每次启动都重新安装一堆依赖,也不用担心换环境把项目搞得一团糟,只要把依赖全部锁在自定义环境里,每次打开Notebook直接切换到对应kernel,就能开始干活。
ModelArts Notebook自定义kernel步骤详解
以实际操作为例,整个过程可以分成六步。
- 第一步,启动Notebook实例,选择任意一个内置kernel进入,然后点击右侧的“Terminal”打开终端。
- 第二步,创建一个新的conda环境,在终端里执行
conda create -n custom_env python=3.8 -y,其中custom_env是这个环境的名称,可以换成项目代号。 - 第三步,激活这个环境,执行
conda activate custom_env,注意终端提示符会变成以custom_env开头。 - 第四步,在新环境里安装ipykernel和ipython,执行
pip install ipykernel ipython,这一步是核心,没有ipykernel,Jupyter无法把内核和你新建的环境对接。 - 第五步,向Jupyter注册这个环境,执行
python -m ipykernel install --user --name custom_env --display-name "Custom Python 3.8"。--display-name决定了下拉菜单里显示的名字。 - 第六步,刷新Notebook页面,点击菜单栏的“Kernel” -> “Change Kernel”,在列表里找到刚刚自定义的名字并选择,如果一切顺利,代码单元格就会以新环境运行。
这里有一个细节值得说明:--user参数会把kernel配置文件写到~/.local/share/jupyter/kernels/custom_env/目录下,这个目录里有个kernel.json,记录着可执行文件路径、显示名称和启动参数,如果你在团队共用的实例上操作,不想让kernel只对当前用户生效,可以改用--prefix指定系统路径。
还有一个常见的疑问:使用自定义kernel会不会让Notebook实例重启后失效?如果你只是重启实例,conda环境和kernel配置文件都会保留,因为磁盘没有重置,但如果释放了整个实例,那所有自装内容都会消失,重新来一遍即可,所以建议把安装命令整理成一个脚本,下次初始化时直接跑一遍,省时省力。
查看kernel配置文件内容
自定义kernel安装完成后,可以打开kernel.json看看,用cat ~/.local/share/jupyter/kernels/custom_env/kernel.json查看,文件内容大致如下:
{
"argv": ["/home/ma-user/.conda/envs/custom_env/bin/python", "-m", "ipykernel_launcher", "-f", "{connection_file}"],
"display_name": "Custom Python 3.8",
"language": "python"
}
其中argv里的第一项是python解释器的绝对路径,必须指向你创建的conda环境,如果之后你手动移动了conda目录,比如因为磁盘空间调整,需要同步修改这个路径,否则kernel会启动失败。
ipython kernel安装失败怎么办?先排查这三步
自定义kernel失败的情况很常见,但多半集中在三个位置。
- 终端里找不到
conda命令,这通常是因为base环境没有激活,先执行conda init bash,然后source ~/.bashrc,重开一个终端再试,如果还不行,直接用全路径/opt/conda/bin/conda访问。 - kernel在列表里显示了,但点击后报“Error loading kernel”,多数情况下是当前环境里缺少
ipykernel包,或者kernel.json里的python路径写错了,在终端执行which python确认是不是自定义环境下的解释器,然后重新安装ipykernel。 - 安装时提示Permission denied,那就是权限问题,ModelArts的默认用户通常有自己目录的写权限,不需要sudo,如果出现权限错,优先检查路径是否在
或~/.local
/home/ma-user下,不要试图写系统目录。
要排查kernel到底卡在哪里,不要只盯着界面,打开终端,执行jupyter kernelspec list查看注册列表,再执行ps aux | grep ipykernel看进程是否启动,如果进程启动后马上退出,日志会输出在终端里,根据错误信息去搜具体报错,比盲目重装快很多。
ModelArts与本地Jupyter对比:各有啥优势
很多人在选环境时纠结“ModelArts和本地Jupyter对比哪个更好”,这个问题没有标准答案,但可以从几个维度来看。
| 对比项 | ModelArts Notebook | 本地Jupyter |
|---|---|---|
| 硬件资源 | 按需租用GPU/CPU,弹性伸缩 | 固定配置,升级成本高 |
| 环境持久性 | 实例释放后环境丢失 | 本地环境永久保留 |
| 预装包 | 内置主流深度学习框架 | 需要自行安装配置 |
| 自定义kernel | 支持,操作路径简单 | 支持,但依赖手动管理 |
| 成本 | 按实例时长计费 | 一次性硬件投入 |
行业共识认为,自定义kernel只是改变了前端到内核的调用方式,并不影响底层资源计费,所以你在ModelArts上无论如何折腾kernel,都不会多出一笔费用,计费只认实例规格和运行时长,和创建了几个kernel没有关系。
从使用场景来看,如果你需要大显存GPU、多机分布式训练,ModelArts的弹性资源显然更省心,但如果你只是偶尔跑跑数据分析,本地Jupyter的物理机器一直存在,不用每次都等待实例启动,自定义kernel在两边的原理一致,区别在于ModelArts里的环境跟实例生命周期绑定,本地环境则完全受你控制。
自定义kernel会收费吗”这个问题就很好回答了:不会,ModelArts的计费范围是CPU、GPU、内存和存储资源,kernel进程本身只是附加在Notebook实例上的一个子进程,有人担心多加一个kernel就等于多开一台机器,这是误解,恰恰相反,同一个Notebook实例里切换kernel,资源占用峰值是固定的,只是运行环境不同而已。
自定义kernel的适用边界
自定义kernel不是银弹,它解决的是“环境切换”问题,不是“性能优化”问题,如果你遇到的是运行速度慢、显存不足,那应该调整实例规格,而不是堆kernel数量,自定义kernel只影响Python代码的执行环境,不会改变Notebook所在镜像的系统库和驱动版本,比如你需要的CUDA版本和镜像自带的驱动程序不兼容,那还是得换镜像,而不是改kernel。
当你发现ModelArts Notebook内置环境不够用时,先问自己:这个问题是出在Python包层面,还是系统驱动层面?如果是前者,自定义kernel是你最灵活的解决方案;如果是后者,别折腾kernel了,直接选择更合适的自定义镜像会更靠谱。
最后再总结一遍:ModelArts的Notebook内置引擎优点在于开箱即用,但版本固定,通过conda创建独立环境,再用ipykernel注册,你可以在五分钟内获得一个完全可控的Python执行环境,安装失败时按终端、环境、权限三个方向排查,基本都能解决,ModelArts Notebook自定义kernel步骤本身并不复杂,关键是把conda环境和ipykernel装对,然后刷新页面,一切自然就会好起来。
关于ipython kernel自定义的常见问题
自定义kernel和内置kernel可以共存吗?
可以,两者本质上都是Jupyter系统里的kernel注册项,只要名字不同就互不干扰,你可以在“Change Kernel”菜单里自由切换,内置的Python 3不会被覆盖,也不会有任何冲突,同一时间只能运行一个kernel,但可以随时切换。
自定义kernel会占用额外内存吗?
不会,自定义kernel并不是一个独立运行的虚拟机,它只是指向了另一套Python环境,当你选中它时,Notebook后端会启动一个新的ipykernel进程,这个进程占用的是Notebook实例配额内的资源,删掉多个不用的kernel也不会释放内存,因为只有当前活跃的kernel才被加载到内存里。
怎么删除不要的自定义kernel?
执行jupyter kernelspec list查看已安装的kernel列表,找到想要删除的名字,然后执行jupyter kernelspec remove <kernel_name>,这个操作只移除Jupyter的注册信息,不会删除你创建的conda环境,如果需要连环境一起清理,再执行conda env remove -n <env_name>,删除自定义kernel不会影响系统内置kernel,可以放心操作。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/587431.html



