VS Code 运行 jupyter 心得(安装 + 远程服务器启动 + 环境变量设置 os.environ + 参数化运行 papermill)
在服务器上,用 vscode 运行 .ipynb 文件是常用的手段,但是搞多了就会发现还是会有各种问题,在这里记录一下。
请先安装 VS Code 的 Jupyter 扩展和 python 扩展。
1. os.environ 的使用
经常在这个运行一个程序前,我们需要加载一些环境变量,来设置比如代理转发(用于下载外面的东西),例:
import os
# 修改 huggingface 下载源为镜像源
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
# 修改网络代理端口
proxy_list = ['HTTP_PROXY', 'HTTPS_PROXY', 'http_proxy', 'https_proxy']
for proxy in proxy_list:
os.environ[proxy] = 'http://u-cEoRwn:EDvFuZTe@172.16.4.9:3128'
# 注:不同服务器后面设置的内容不一样,自己改改。
也可以用这个去指定 CUDA_VISIBLE_DEVICES,如
os.environ['CUDA_VISIBLE_DEVICES'] = '4,5,6,7'
但是注意,环境变量的设置最好在最开始,即代码开始的代码设置,再 import 其它包,否则就可能不生效了。
2. conda 环境中安装 jupyter:
可以在 VS Code 选择环境后自动安装,但是有的时候网不好需要手动安装:
python -m pip install jupyter notebook -U
或者(推荐下面这个)
conda install jupyter notebook -y
3. 手动启动
有时候环境加载时非常复杂的,不一定说设置一些环境变量就行,比如我现在的服务器是需要手动加载 cuda 的,这个时候就只能先加载环境再手动启动了。
如 source /home/bingxing2/apps/package/pytorch/2.1.0+cuda118_cp310/env.sh
这样加载,
那只能加载完这个和虚拟环境以后,启动
jupyter notebook
记录端口,例:
http://127.0.0.1:8890/?token=cfb7d47e2a70f09f8997f24b09995dbb147c9467c051d188
然后 Vscode 打开文件,在右上角点一下,选择其它内核,现有 jupyter 服务器,输入这个即可。
4. 在远程服务器上运行 jupyter,本机控制 notebook:
前向代理:
ssh -L 8889:localhost:8889 remote-name
启动时指定 port:
jupyter notebook --no-browser --port=8889 --ip=0.0.0.0
--ip=0.0.0.0 代表监听应该监听所有可用的网络接口。这意味着你可以在本地网络中的任何设备上通过浏览器访问这个 Jupyter Notebook 服务器。一般都是从localhost 来的,可以不加。
--no-browser 这个选项告诉 Jupyter Notebook 在启动时不打开浏览器窗口。一般来说用 VScode 时不用打开浏览器窗口的。为了加速,如果用不上建议不加。
如果有登录节点需要双重跳转见我的这篇博客:https://www.cnblogs.com/coldchair/p/18526990
5. 后台运行:
jupyter nbconvert --to notebook --execute your_notebook.ipynb --output your_notebook_executed.ipynb
6. 参数化和自动化 jupyter 笔记本的运行
papermill:https://github.com/nteract/papermill
这个很好用啊。
一般来说想要 jupyter 的可视化,步骤执行。
但是调整好以后,想带参数的批量化运行很困难,一般只能转 .py,加 argparse 库这样做。
这个库可以直接带参数运行 .ipynb 文件,只需简单几个步骤:
安装:
pip install papermill
右键带有参数的块-笔记本单元格-Mark Cell as Parameters
然后会变成这样:
这里提供一个多进程并发运行脚本:
import papermill as pm
import os
from concurrent.futures import ThreadPoolExecutor
subj_list = [f'subj0{i}' for i in range(1, 8 + 1)]
out_dir = './pm_outputs_v2'
os.makedirs(out_dir, exist_ok=True)
def execute_notebook(subj):
pm.execute_notebook(
'./make_subjmri_single.ipynb',
f'{out_dir}/make_subjmri_single_{subj}.ipynb',
parameters=dict(subject=subj),
log_output=True,
)
with ThreadPoolExecutor(max_workers=2) as executor:
futures = [executor.submit(execute_notebook, subj) for subj in subj_list]
for future in futures:
future.result()
会自动保存运行后的 .ipynb 文件(你指定路径)。
原理是:在带有 parameters tag 的块的后面,inject 一个 tag=injected-parameters 的块来设置参数。
例如:
请注意,请将 parameters 的块单独出来(不要和代码运行放到一起),且尽量都放到文件最前面。