Docker Compose 部署大模型GPU集群:高效分配与管理算力资源
文章目录
-
- [Docker Compose 部署大模型GPU集群:高效分配与管理算力资源](#Docker Compose 部署大模型GPU集群:高效分配与管理算力资源)
-
- [一 Dockerfile 编写](#一 Dockerfile 编写)
- [二 Dockerfile 示例](#二 Dockerfile 示例)
- [三 分配GPU资源](#三 分配GPU资源)
本文详细介绍了如何使用 Docker Compose 部署大模型所需的 GPU 算力资源,提供从编写 Dockerfile
到 GPU 分配的完整流程。通过 docker-compose
文件,您可以指定 GPU 资源,灵活控制设备数量或指定特定的 GPU 使用。无论是通过 count
参数分配 GPU 数量,还是使用 device_ids
映射具体的 GPU,本指南都涵盖了相关的配置示例,确保高效管理和使用多GPU环境。此外,文章还展示了如何为 Python 应用配置依赖和工作环境,使部署变得更加简洁流畅。
预备课:
一 Dockerfile 编写
Dockerfile 关键字
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME ["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
二 Dockerfile 示例
示例是 Java 的 Dockerfile,请改为python的或者其他语言的
dockerfile
# 使用官方 Python 3.9 镜像作为基础镜像
FROM python:3.9-slim
# 作者信息
MAINTAINER your <your@email.com>
# 设置环境变量,指定语言和字符编码
ENV LANG zh_CN.UTF-8
ENV LANG C.UTF-8
# 暴露端口(可以根据实际应用需要修改)
# EXPOSE 80
# 将环境变量 LANG 添加到系统配置中
RUN echo "export LANG=zh_CN.UTF-8" >> /etc/profile
# VOLUME 指定了临时文件目录为 /tmp,映射到主机的 /var/lib/docker 下
VOLUME /tmp
# 设置工作目录为 /app
WORKDIR /app
# 复制当前目录下的所有文件到容器的 /app 目录中
COPY . /app
# 如果有需要安装的 Python 依赖包,可以使用 requirements.txt 文件安装依赖
# 如果没有 requirements.txt,以下行可以注释掉或删除
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# 这里是启动脚本,使用 Python 启动应用程序(需要根据实际情况修改入口文件)
ENTRYPOINT ["python", "app.py"]
三 分配GPU资源
Docker compose启动分配GPU资源
1)GPU分配:指定count
yaml
version: "3.8"
services:
test:
# 使用 NVIDIA 官方的 CUDA 开发镜像,基于 UBI8 (Red Hat Universal Base Image 8)
image: nvidia/cuda:12.3.1-devel-ubi8
# 容器启动时执行的命令,这里是运行 nvidia-smi 以查看 GPU 的状态
deploy:
resources:
reservations:
devices:
- driver: nvidia # 指定使用 NVIDIA 作为设备驱动
count: 1 # 分配一个 GPU 给容器
capabilities: [gpu] # 指定容器使用 GPU 计算能力
2)GPU分配:指定deviceid
yaml
version: "3.8"
services:
test-gpu:
# 容器名称
container_name: test-gpu
# 使用的镜像,指定为带有GPU支持的TensorFlow镜像
image: tensorflow/tensorflow:latest-gpu
command: python -c "import tensorflow as tf;tf.test.gpu_device_name()"
# 重启策略:容器退出时总是重新启动容器
restart: always
ports:
- "9000:9000"
- "9001:9001"
- "9002:9002"
environment:
- TZ=Asia/Shanghai # 设置时区为上海
volumes:
- ./pub/llm:/opt/new-path/models/model_repository
# 冒号前为主机上的模型目录路径,请根据实际环境修改;冒号后为映射到容器内的路径
deploy:
resources:
reservations:
devices:
- driver: nvidia
# 指定宿主机上映射给容器使用的GPU ID,若需要映射多个GPU,可以写为['0','1','2']
device_ids: ['0', '3']
capabilities: [gpu] # 使用GPU的计算能力