写在前面

虽然pycharm和vscode都可以使用远程服务器,但是笔者在写本文档时也属于入门深度学习的阶段,对于网上一些入门课程(跟着李沐学AI)需要跟着敲代码,并且想要显式的观看每一个函数之类的代码段的输出,因此就引出以下两个需求:

  • 想要jupyter优质的交互环境
  • 针对一些多卡训练课程,本地电脑的显卡资源无法满足,需要实验室的多卡环境

于是就想到了利用本地电脑远程访问实验室服务器的jupyter notebook,而因为实验室的服务器安全问题,导致如今的连接方式为公钥连接,但网上针对公钥连接的远程服务器访问其jupyter notebook的教程少之又少,因此就有了此教程

环境

  • 本地电脑windows
  • 实验室远程服务器ubuntu,服务器地址:118.XXX.XXX.XXX,端口号:6XXX

操作

  1. 确保远程服务器的所在的conda环境中有jupyter notebook
  2. 需要分别在本地电脑和远程服务器进行操作

    • 远程服务器
    1. 在远程电脑上运行以下指令
      # 1. 生成配置文件jupyter_notebook_config.py,文件中是可以对jupyter进行定制的参数
      jupyter notebook --generate-config
      # 2. 生成密码
      # 切换到python环境
      python3
      # 包含生成密码的头文件
      from notebook.auth import passwd
      # 密码生成函数
      passwd()
      # 会有以下显示
      Enter password:AAAAA
      Verify password:AAAAA
      res: 'sha1:xxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
      # 其中AAAAA是本地进行远程端口映射的密码,''单引号中的密码将被用于存在第一步的配置文件之中
      
    2. 打开.jupyter文件中的jupyter_notebook_config.py
      jupyter配置文件
    3. 在文件末尾添加以下两行代码
      # 别忘了u和单引号''
      c.NotebookApp.password = u'第一步最后的长串密码'
      # 设置远程服务器的端口,可以随意设
      c.NotebookApp.port = 8090
      
    • 本地电脑
    1. 打开本地电脑anaconda powershell prompt
      anaconda_prompt
    2. 使用ssh的方法进行远程服务器jupyter端口的本地映射,运行以下代码
      # 说明:命令各部分含义如下
      # ssh -L [本地端口]:localhost:[远程端口] [远程用户名]@[远程IP] -p [ssh连接端口]
      # 对于实验室来说,远程IP和ssh连接端口应该固定,即118.XXX.XXX.XXX和6XXX
      # 对于远程用户名则是管理员给予的名字(服务器用户名),我的就是liXXXX
      # 对于远程端口应与远程服务器的配置文件中自己设置的一致,正如上面的8090
      # 对于本地端口则可以任意设置,但需要记住
      ssh -L 8083:localhost:8090 liXXXX@118.XXX.XXX.XXX -p 6XXX
      
    3. 笔者在第一次运行以上代码时会报错,有以下错误
      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      Permissions 0644 for 'id_rsa.rsa' are too open.
      It is required that your private key files are NOT accessible by others.
      This private key will be ignored.
      bad permissions: ignore key: id_rsa.rsa
      Permission denied (publickey,keyboard-interactive).
      
      或者也会出现没有权限访问的现象(permission denied),原因在于私钥的权限问题,需要将私钥设置为以下形式:
      权限设置
      # 注意:组或用户名只有自己,权限为读取
      
    4. 没问题的话,终端会直接连接到远程服务器,有如下显示:
      ssh映射
  3. 切换到需要的conda环境

    conda activate mm
    
  4. 运行jupyter notebook
    jupyter notebook
    
  5. 在本地电脑浏览器上打开以下网址
    # 与ssh连接时的本地接口需要对应
    http://localhost:8083/
    
    没问题的话会有以下显示,填写登录密码,也就是passwd()之后你输入的密码,需要注意的是,每次改变映射的本地端口都会要求输入密码
    输入密码
  6. 填写密码,完成远程连接
    页面
  7. 检验成功与否,输入以下代码以测试是否可以包含torch以及识别到多卡
    检验是否成功
  8. 推荐安装李沐老师-《动手学深度学习》提到的一个插件,主要用来显示代码段的运行时间,在终端中输入以下指令
    pip install jupyter_contrib_nbextensions
    jupyter contrib nbextension install --user
    jupyter nbextension enable execute_time/ExecuteTime
    
    在jupyter notebook内部同样可以直接运行以上命令行,但是需要在每个指令前加感叹号,如
!jupyter contrib nbextension install --user

写在最后

连接到远程服务器的jupyter-notebook之后就可以愉悦的开启炼丹之路了~