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 的块单独出来(不要和代码运行放到一起),且尽量都放到文件最前面。

posted @ 2024-05-16 17:33  Cold_Chair  阅读(1189)  评论(0编辑  收藏  举报