• Docker入门指南:基于 docker 搭建机器学习/深度学习开发环境


    实际工作中,许多项目开发需要在Linux服务器上进行,本文为习惯使用 Windows 操作系统的朋友介绍一种基于Docker的,跨平台、便携性(方便移植、重新部署、可远程访问)的开发环境搭建方法。

    1. 创建开发环境

    首先来创建开发环境容器,深度学习有TensorFlow和Pytorch两种主流开发框架,建议直接从它们的官方镜像创建开发环境容器1,其GPU版本的官方镜像中已安装好显卡驱动和CUDA,可直接启用GPU训练。(TensorFlow官方Docker镜像仓库PyTorch官方Docker镜像仓库

    docker run -it  --name="torch-gpu" -p xxxx:22 --privileged -v /home/project/:/home:rw -v /mnt:/mnt:rw  --ipc=host --gpus all  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all  hadeszsc/torch-gpu:1.12.0 /bin/bash
    
    • 1

    若通过上述方法配置的 Docker 开发环境无法识别 GPU,那么可尝试下述方法,通过 NVIDIA 提供的官方镜像来配置Docker开发环境,可获得更好的 GPU 支持NVIDIA官方Docker镜像仓库)。具体命令如下:

    #
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
    systemctl restart docker   # 以上设置在重启docker服务后生效
    # 
    docker run -it  --name="tf-gpu" -p xxxx:22 --privileged -v /home/project/:/home:rw -v /mnt:/mnt:rw --ipc=host --gpus all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all nvcr.io/nvidia/tensorflow:22.10.1-tf2-py3 /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    创建环境后,建议直接进入环境容器内安装所需的工具包,因为 IDE 内的集成终端仅能完成部分终端操作(如:不能识别 conda 命令)。TensorFlow 官方镜像未安装 Anconda,可直接通过 pip 命令进行工具包安装;PyTorch 官方镜像中已安装 Anconda,可使用 conda 命令。

    2. Docker 容器配置

    Docker 容器需要启动 SSH 服务后,才可实现与 IDE 的连接。首先在容器内安装 SSH 服务,shell 命令如下2

    # 更新apt,并安装文本编辑器、SSH服务和screen服务
    apt-get update && apt-get install -y vim openssh-server screen && rm -rf /var/lib/apt/lists/*
    
    • 1
    • 2

    然后检查ssh-server是否安装成功,shell 命令如下:

    service ssh start
    
    • 1

    出现如下结果,即为安装成功

    在这里插入图片描述

    接下来,设置 ssh-server 在容器启动时自启动(不然每次启动容器后,需手工启动该服务)并配置该服务,shell 命令如下:

    # 设置 ssh 服务开机自启
    echo 'service ssh start'>>~/.bashrc
    
    # 配置 SSH 服务使用密码登录
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
    # vim /etc/ssh/sshd_config		# 修改后可用 vim 打开文档确认
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    随后,为ssh登录设置一个密码,这里密码暂定为 passwd,请牢记你的密码,同时,用户名默认为root

    passwd
    
    • 1

    结果如下图所示:

    在这里插入图片描述

    最后重启ssh服

    service ssh restart
    
    • 1

    结果如下图所示:
    在这里插入图片描述

    3. SSH 连接 IDE

    3.1 SSH连接测试

    首先测试环境(容器)SSH服务是否配置成功,在本机 cmd 中输入如下 shell 命令:

    # 如:ssh -p 22 root@192.168.1.1
    ssh -p 容器22端口映射到本机或服务器上的端口号 root@本地或服务器ip地址(注意与前@号间不要有空格)
    
    • 1
    • 2

    Windows 系统中,查询本机ip地址的方法是在 cmd 中输入 ipconfig 命令,结果如下图中圈出所示。一定注意要用以太网适配器(WSL)的IPV4地址,这是本机网卡的ip地址,它与电脑硬件绑定、终身不变。若错用无线局域网适配器(WLAN)的IPV4地址,可能会随接入无线网路由器的不同而发生改变(该改变会引起 Docker SSH 连接错误)。
    在这里插入图片描述

    若连接成功,则如下图所示,输入yes后按回车键即可。

    在这里插入图片描述

    若出现下图错误,是由网络安全设置对本地实施的保护措施,它由于本次访问此ip地址:端口号组合提供的身份验证秘钥与第一次访问时保存在本地的身份秘钥不符所导致。这是因为原Docker容器已被删除,新创建的Docker容器的身份秘钥发生了改变。仅需按所给出地址 Offending ECDSA key in C:\Users\xxx/.ssh/known_hosts,删除 known_hosts 文件中此ip地址:端口号对应的记录即可。

    在这里插入图片描述

    3.2 正式连接 IDE

    VSCode 是一个好的 IDE 连接选择。其中常用的SSH连接插件有三种,这里我们选择使用 Remote SSH(本地插件安装),其他两种插件的适用场景可参考文章《VSCode中利用Remote SSH插件远程连接服务器并进行远程开发3

    VSCode中,Remote SSH的详细使用方法可参考文章《VSCode Remote 体验》和文章《VSCode+Docker: 打造最舒适的深度学习环境》。要添加多个 SSH 连接,可在 C:\Users\user.ssh\config 文件中设置多条记录,具体设置方法可参考文章《VSCODE使用多个账户连接远程服务器》。

    值得注意的是:

    1. 必须在(SSH连接的)远程开发环境中,也安装VSCode的Python和Jupyter插件
    2. 同一个 ip 只能生效一个端口的SSH连接,若在C:\Users\user.ssh\config 中配置了同一个 ip 的不同端口的多条记录,则只有最上面的那一条端口配置生效,需要切换端口时需要人工修改config文件中不同端口配置记录的位置。

    4. Docker 容器直连 IDE

    在 VSCode 中安装 Dev Containers 插件。然后在远程资源管理器中按如下图所示配置。
    在这里插入图片描述


    1. Docker安装请参考作者文章:Docker入门指南:Docker 安装方法(Win10 家庭版)
      Docker容器的创建请参考作者文章:Docker入门指南 ↩︎

    2. 不论TensorFlow 官方镜像还是 PyTorch 官方镜像都使用 Ubuntu 系统,所以 Linux 软件安装采用 apt 命令 ↩︎

    3. 该参考文献对比了三种 SSH 连接插件的异同及其适用场景 ↩︎

  • 相关阅读:
    yii2,脚本内存溢出解决办法
    vue-router 路由
    基于PHP的人才招聘网站设计
    selenium.webdriver chrome驱动下载地址
    指针详解【C语言】
    mysql中表与表之间的方式有几种
    Cpp知识点系列-宏定义
    centos7.9 telnet其他服务器的端口不通
    终于更新了!时隔一年niushop多商户b2b2c的新补丁v5.0.2终于发布了,一起看看有啥新变化
    对于对象初始化的加深理解
  • 原文地址:https://blog.csdn.net/xunyishuai5020/article/details/125816332