Info

  • 预期实现的目标:
    • 每个用户可以拥有自己的虚拟机环境,操作和存储隔离
    • 提供独立的 SSH 访问
    • 提供 jupyter 访问
    • 有公共的数据集文件夹,可以让所有用户直接读取数据
    • 提供可视化界面方便管理员操作(不一定完成)

服务器使用者

Attention

实验不易,数据一定要备份!建议通过 git 对实验代码进行版本管理,并在 GitHubGitee 等平台创建私有代码仓库进行同步

管理员为每个人都创建了一个 container,使用者只需要向管理员索要端口、用户名和密码即可,ip 为服务器 ip 保持不变

环境中默认保留了深度学习所必须的 cuda 环境和 miniconda 环境,请自行安装所需的深度学习包(例如 pytorch、tensorflow 等)

SSH 访问

Warning

  • 第一次登录请修改密码,防止被恶意登录
  • 修改密码命令:passwd

这里以 Tabby 为例,在 ssh 连接界面添加用户名、密码和端口即可(初始用户名和密码均为 root),需要注意的是每个人的端口是不同的,具体端口号请咨询管理员

image.png

jupyter 访问

jupyter 访问默认不提供,因为可以通过 ssh 连接 VSCode、PyCharm 等 IDE 实现运行 .ipynb 格式文件。如果一定需要 jupyter 访问,请暴露 8888 端口,并通过主机端口进行转发实现

服务器管理员

Attention

服务器主机操作非常重要,可能会影响到所有 container 的运行,所以请妥善保管主机密码

Example

  • 对于新用户请求使用服务器资源的流程只需两步
    1. 先通过 sudo docker images 确认需要的镜像
    2. 再创建容器 sudo docker run -it --runtime=nvidia --gpus all -d --restart=always --shm-size="64g" --name [容器名称] -p [主机端口]:22 [镜像名称] /bin/bash
      • 容器名称命名规则:名字拼音缩写-入学年份+学号后 3 位,例如:张三是 22 届学生,学号为 2022000477,那么容器就可以命名为 zs-22477
      • 主机端口使用规则:端口有限,为了不影响系统服务,端口的使用建议从 10001 递增,例如:10001 被使用了,下一个被使用的端口就是 10002 ,以此类推
      • 镜像:现在服务器只提供了一个镜像:conda-cuda12.0,包含了 miniconda 和 cuda 开发环境,gpu 可以正常调用

镜像管理

如果需要创建新的镜像,请制作 Dockerfile 文件进行创建,服务器 conda-cuda12.0 镜像使用了第三方镜像创建深度学习环境,Dockerfile 如下:

FROM mortals/codeenv:conda-cuda12.0
 
# 更新并安装 OpenSSH 服务
RUN apt-get update && \
    apt-get install -y openssh-server && \
    mkdir /var/run/sshd
 
# 设置 root 用户的密码(这里设置为 "root",可以根据需要更改)
RUN echo 'root:root' | chpasswd
 
# 允许 root 用户通过 SSH 登录(根据安全需求配置)
RUN sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
 
RUN /etc/init.d/ssh restart
 
EXPOSE 22
# EXPOSE 8888 # 如果需要jupyter请暴露这个端口
 
CMD ["/usr/sbin/sshd", "-D"]

服务自启

为了能够在创建容器时自启动服务,需要额外的脚本(以 ssh 为例,其他服务类似):

  1. 先创建 start_ssh. sh 脚本
touch /root/start_ssh.sh
  1. 修改 start_ssh. sh 内容
vim /root/start_ssh.sh

内容如下:

#!/bin/bash
 
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$LOGTIME] startup run..." >>/root/start_ssh.log
service ssh start >>/root/start_ssh.log
  1. 修改执行权限
chmod +x /root/start_ssh.sh
  1. 添加到 .bashrc
vim /root/.bashrc

在文件末尾添加如下内容:

# startup run
if [ -f /root/start_ssh.sh ]; then
      bash /root/start_ssh.sh
fi

容器管理

# 最重要的就是如何创建新的容器,命令如下:
sudo docker run -it --runtime=nvidia --gpus all -d --restart=always --shm-size="64g" --name [容器名称] -p [主机端口]:22 [镜像名称] /bin/bash

下面是 gpt 生成的命令解释:

  • sudo: 以超级用户权限执行命令,通常用于需要管理员权限的操作。
  • docker run: 运行一个 Docker 容器。
  • -it: 这两个选项组合在一起,-i 表示让容器保持运行(交互式模式),-t 使容器支持伪终端,因此你可以与容器内部进行交互。
  • --runtime=nvidia: 这是指定容器使用 nvidia 运行时,以便能够访问 NVIDIA GPU 资源。
  • --gpus all: 这个选项指定容器能够访问所有可用的 GPU。如果你只希望使用部分 GPU,可以替换 all 为特定 GPU 的编号,例如 --gpus '"device=0"'
  • -d: 容器以 “detached” 模式运行,即在后台运行容器,命令行界面不会被占用。
  • --restart=always: 这表示容器在退出或 Docker 服务重启时会自动重启。
  • --shm-size="64g": 设置容器的共享内存大小为 64GB。共享内存是进程间通信的关键,增加这个值有时可以提高性能,尤其是在处理大数据时。
  • --name [容器名称]: 设置容器的名称为 [容器名称],你可以用你自定义的名称替换这里的 [容器名称]
  • -p [主机端口]:22: 将主机的 [主机端口] 映射到容器的 22 端口。通常,22 端口是用于 SSH 服务的,因此这将使你能够通过 SSH 访问容器。你需要用实际的主机端口号替换 [主机端口]
  • [镜像名称]: 这是容器使用的镜像名称。conda-cuda12.0 可能是一个预装了 Conda 和 CUDA 12.0 环境的镜像。
  • /bin/bash: 启动容器后,容器将运行 /bin/bash,即进入一个 Bash shell 环境。