Docker Compose 部署大模型GPU集群:高效分配与管理算力资源

news/2024/10/3 11:36:13 标签: docker, 容器, 运维, gpu算力, gpt

Docker Compose 部署大模型GPU集群:高效分配与管理算力资源

文章目录

    • Docker Compose 部署大模型GPU集群:高效分配与管理算力资源
      • 一 Dockerfile 编写
      • 二 Dockerfile 示例
      • 三 分配GPU资源
        • 1)GPU分配:指定count
        • 2)GPU分配:指定deviceid

本文详细介绍了如何使用 Docker Compose 部署大模型所需的 GPU 算力资源,提供从编写 Dockerfile 到 GPU 分配的完整流程。通过 docker-compose 文件,您可以指定 GPU 资源,灵活控制设备数量或指定特定的 GPU 使用。无论是通过 count 参数分配 GPU 数量,还是使用 device_ids 映射具体的 GPU,本指南都涵盖了相关的配置示例,确保高效管理和使用多GPU环境。此外,文章还展示了如何为 Python 应用配置依赖和工作环境,使部署变得更加简洁流畅。

预备课

Docker 安装与配置:从入门到部署

Docker 镜像的构建与多架构支持

一 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
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
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的计算能力

http://www.niftyadmin.cn/n/5688275.html

相关文章

SpringSession微服务

一.在linux中确保启动起来redis和nacos 依赖记得别放<dependencyManagement></dependencyManagement>这个标签去了 1.首先查看已经启动的服务 docker ps 查看有没有安装redis和nacos 2.启动redis和nacos 发现没有启动redis和nacos,我们先来启动它。&#xff0c;…

[Linux] Linux 的进程如何调度——Linux的 O(1)进程调度算法

标题&#xff1a;[Linux] Linux 的进程如何调度——优先级与进程调度 个人主页水墨不写bug 目录 一、前言 二、将要出现的概念 1.进程调度队列 2.位图 3.进程的优先级 三、Linux进程的调度过程 1.活动队列&#xff08;*active指向的队列&#xff09; 2.过期队列&#…

thinkphp6入门(25)-- 分组查询 GROUP_CONCAT

假设表名为 user_courses&#xff0c;字段为 user_id 和 course_name&#xff0c;存储每个用户选修的课程&#xff0c;想查询每个学生选修的所有课程 SQL 原生查询 SELECT user_id, GROUP_CONCAT(course_name) as courses FROM user_courses GROUP BY user_id; ThinkPHP 代码…

Bilibili视频如何保存到本地

Bilibili(哔哩哔哩)作为中国领先的视频分享平台之一&#xff0c;汇聚了大量的优质内容&#xff0c;从搞笑动画、综艺节目到专业教程&#xff0c;应有尽有。许多用户时常会遇到这样的需求&#xff1a;希望将视频保存到本地&#xff0c;方便离线观看或者保存珍藏。由于版权保护等…

滚雪球学Oracle[3.4讲]:事务控制与锁管理

全文目录&#xff1a; 前言一、事务隔离级别的深入探讨1.1 事务的定义与基本特性1.2 事务隔离级别的概念1.3 各隔离级别中的问题案例演示&#xff1a;不同隔离级别的行为 1.4 隔离级别与性能的权衡 二、锁的种类与死锁问题解决2.1 锁的种类2.2 锁的粒度2.3 死锁与解决策略死锁的…

三、数据链路层(上)

目录 3.1数据链路层概述 3.1.1术语 3.1.2功能 3.2封装成帧和透明传输 3.2.1封装成帧 ①字符计数法 ②字符&#xff08;节&#xff09;填充法 ③零比特填充法 ④违规编码法 3.2.2透明传输 3.2.3差错控制 差错原因 检错编码 奇偶校验 ☆循环冗余码CRC 例题 纠错…

`git fetch` 检查更新

git fetch 是 Git 中的一个命令&#xff0c;主要用于从远程仓库获取最新的更新&#xff0c;但不会自动将这些更新合并到你的本地分支。它的主要作用是让你可以查看远程仓库的最新变化&#xff0c;而不改变你当前正在工作的代码。 1. 获取远程更新 git fetch 会从远程仓库下载…

python之with

with上下文管理是什么呢&#xff1f; 一般都是使用系统提供的一些with语句&#xff0c;列如我要去读取一些数据进行分析&#xff0c;就可以使用with open去读取某些数据&#xff0c;或者我要把一些图片给他保存到某些地方&#xff0c;可以用with给他写入。 上下午管理器with是…