• 分布式训练 最小化部署docker swarm + docker-compose落地方案


    目录

    背景:

    前提条件:

    一、docker环境初始化配置

    1. 安装nvidia-docker2

    2. 安装docker-compose工具 

    3. 获取GPU UUID

    4. 修改docker runtime为nvidia,指定机器的UUID

    二、docker-swarm 环境安装

    1. 初始化swarm管理节点

    2. 加入工作节点

    3. 查看集群节点

    三、拷贝基础镜像及部署文件 

    1. Docker 镜像

    2. docker-compose.yml

    四、部署应用 

    1. 部署服务

    2. ssh免密验证


    背景:

    实现不同宿主机上的容器可以互通,并且可以免密ssh登陆

    前提条件:

    目前已知问题:swarm无法支持InfiniBand

    机器具备docker、NVIDIA显卡、NVIDIA驱动等相关安装包和硬件设施,nvidia-smi 可以正常显示出机器的GPU显卡

    Docker 版本必须 > 1.12

    一、docker环境初始化配置

    1. 安装nvidia-docker2

    1. # 执行如下命令
    2. apt install nvidia-docker2 -y

    2. 安装docker-compose工具 

    将安装包拷贝到环境,只需要在docker swarm leader节点安装

    1. # 下载docker-compose
    2. sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    3. mv docker-compose-linux-x86_64 docker-compose
    4. chmod +x docker-compose
    5. mv docker-compose /usr/bin/docker-compose

    3. 获取GPU UUID

    nvidia-smi -a  | grep UUID

    4. 修改docker runtime为nvidia,指定机器的UUID

    修改文件成如下内容,注意其中的GPU UUID需要根据实际的uuid来填写,同时注意格式。

    1. (base) root@nm-zhipu-a100-develop01:~# cat /etc/docker/daemon.json
    2. {
    3. "runtimes": {
    4. "nvidia": {
    5. "path": "nvidia-container-runtime",
    6. "runtimeArgs": []
    7. }
    8. },
    9. "default-runtime": "nvidia",
    10. "node-generic-resources": [
    11. "NVIDIA-GPU=GPU-528afedf-02cf-7380-e22b-e2c05c1be4ec",
    12. "NVIDIA-GPU=GPU-5c46d5eb-0996-a5ac-cb7a-29f274d046a4",
    13. "NVIDIA-GPU=GPU-f57f6d1b-ea13-1480-6321-7a26181b838d",
    14. "NVIDIA-GPU=GPU-75acc759-bb26-da0b-21c5-a31dca12e93f",
    15. "NVIDIA-GPU=GPU-7e4da326-2d9e-3530-9f46-673474746e0b",
    16. "NVIDIA-GPU=GPU-76f183b8-b750-73bc-b438-404a16ae7b78",
    17. "NVIDIA-GPU=GPU-34823444-9a29-0776-f483-c802c6057039",
    18. "NVIDIA-GPU=GPU-a474810c-7356-b242-d0d8-5e83714655de"
    19. ],
    20. "default-shm-size": "10G"
    21. }
    1. # 将如下文件中的swarm-resource 这行注释打开
    2. /etc/nvidia-container-runtime/config.toml
    3. swarm-resource = "DOCKER_RESOURCE_GPU"
    4. # 重启docker
    5. systemctl restart docker

    二、docker-swarm 环境安装

    1. 初始化swarm管理节点

    1. # docker swarm leader角色执行
    2. # 初始化一个新的swarm,并且当前的机器变为swarm manager,执行命令后会返回join相关的指令
    3. docker swarm init --advertise-addr 192.168.249.11 #根据实际机器IP填写

    类似下图的一条的命令 

    2. 加入工作节点

    1. # worker节点执行,如果有多个worker节点则都需要执行
    2. docker swarm join --token SWMTKN-1-51nvltfqyxlfo0m5f5unzufhs03gmtcs8uoues6zgln0vzhy2c-5agl9x8f9nwrwagy7ud8k6oti 192.168.249.11:2377

    3. 查看集群节点

    1. # 查看swarm节点信息
    2. docker node ls

    三、拷贝基础镜像及部署文件 

    1. Docker 镜像

    如果要在客户方build,需要拷贝Dockerfile文件,并且保证客户环境可以下载依赖的基础镜像和相关的依赖包

    Dockerfile

    1. FROM nvcr.io/nvidia/pytorch:23.07-py3
    2. # ADD /data0/nfs/share/pangguoqing/glm66b/data/ /workspace/data
    3. COPY . /workspace
    4. COPY ssh /root/.ssh/
    5. RUN apt-get update && apt-get install -y --no-install-recommends ssh && \
    6. apt-get install -y net-tools && \
    7. wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pdsh/pdsh-2.29.tar.bz2 && \
    8. tar jxvf pdsh-2.29.tar.bz2 && \
    9. cd pdsh-2.29 && \
    10. ./configure --with-ssh --with-rsh --with-mrsh--with-mqshell --with-qshell --with-dshgroups--with-machines=/etc/pdsh/machines --without-pam && \
    11. make && \
    12. make install
    13. RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
    14. pip install deepspeed && \
    15. pip install sentencepiece
    16. EXPOSE 22
    17. ENV CUDA_DEVICE_MAX_CONNECTIONS="1"
    18. WORKDIR /workspace
    19. ENTRYPOINT service ssh restart && bash

    2. docker-compose.yml

    • 如果有多个worker节点,则需要在文件中增加对应的配置,从0开始往下顺延

    • 挂载点修改

    1. version: '3.7'
    2. services:
    3. main:
    4. image: wind/glm66b-train:base-v2
    5. hostname: main
    6. init: true
    7. tty: true
    8. deploy:
    9. replicas: 1 # 定 义 在 Swarm 中 运 行 的 副 本 数
    10. restart_policy:
    11. condition: on-failure
    12. environment:
    13. - NVIDIA_VISIBLE_DEVICES=all
    14. volumes:
    15. - /data0/nfs/share/pangguoqing/glm66b/data/:/workspace/data/
    16. networks:
    17. - my_overlay_network
    18. worker01:
    19. image: wind/glm66b-train:base-v2
    20. hostname: worker-0
    21. init: true
    22. tty: true
    23. deploy:
    24. replicas: 1
    25. restart_policy:
    26. condition: on-failure
    27. environment:
    28. - NVIDIA_VISIBLE_DEVICES=all
    29. volumes:
    30. - /data0/nfs/share/pangguoqing/glm66b/data/:/workspace/data/
    31. networks:
    32. - my_overlay_network
    33. networks:
    34. my_overlay_network:
    35. driver: overlay

    四、部署应用 

    1. 部署服务

    1. # 部署
    2. docker stack deploy -c docker-compose.yml wande。#根据实际名称修改
    3. # 显示部署的服务
    4. docker stack services wande

    1. # 查看服务容器状态
    2. docker stack ps wande

    2. ssh免密验证

    登陆任意一个容器,通过ssh root@主机名即可登陆

    ssh root@worker01

    参考文档:

    docker service create | Docker Docs

    https://www.reddit.com/r/docker/comments/mh36w1/using_nvidia_gpu_with_docker_swarm_started_by/

  • 相关阅读:
    常见编写JavaScript代码时容易出现的错误(3)
    【生日快乐】SpringBoot SpringBoot 提高篇(第二篇) 第6章 SpringBoot 高级配置 6.1 临时属性配置
    智慧社区管理系统-知识点补充01
    关键路径的分析
    JAVA计算机毕业设计医生在线诊所平台Mybatis+系统+数据库+调试部署
    JRebel在IDEA中实现热部署 (JRebel实用版)
    多线程进阶
    JVM(十二) —— 对象的实例化
    开发工程师必备————【Day23】Django基础知识
    探寻欧洲市场的机遇:深度剖析欧洲跨境电商
  • 原文地址:https://blog.csdn.net/weixin_43798031/article/details/132528469