AIGC 模型容器化:Docker 封装 LLaMA 3 + Stable Diffusion 多服务集成方案

在人工智能生成内容(AIGC)领域,LLaMA 3(大型语言模型)和Stable Diffusion(文本到图像生成模型)是核心工具。通过Docker容器化,可以将这些模型封装为独立、可移植的服务,实现高效部署和集成。本方案基于Docker和Docker Compose,提供多服务集成方案,支持GPU加速(如NVIDIA GPU),确保服务可扩展和易维护。

1. 方案概述

容器化AIGC模型的主要优势包括:

  • 隔离性:每个模型运行在独立容器中,避免依赖冲突。
  • 可移植性:Docker镜像可在任何支持Docker的环境中运行。
  • 资源优化:利用GPU加速,提高推理速度。
  • 多服务集成:通过Docker Compose管理多个服务(如LLaMA 3文本生成服务和Stable Diffusion图像生成服务),并通过API通信。

整体架构:

  • LLaMA 3服务:提供文本生成API。
  • Stable Diffusion服务:提供图像生成API。
  • 集成网关(可选):一个轻量级服务(如FastAPI)协调多服务调用,但本方案直接使用Docker Compose简化。
  • 网络:Docker内部网络实现服务间通信。

硬件要求:

  • 推荐使用支持CUDA的GPU(如NVIDIA GPU),以加速模型推理。
  • 最小系统资源:16GB RAM,20GB磁盘空间(模型文件较大)。
2. LLaMA 3容器化

LLaMA 3是Meta的文本生成模型。我们将构建一个Docker镜像,封装模型推理服务,暴露REST API。

步骤:

  • 创建项目目录:mkdir llama3_service && cd llama3_service
  • 编写Dockerfile:基于PyTorch镜像,安装依赖,下载模型,并启动API服务。
  • 使用FastAPI框架提供API端点(如/generate)。

文件:Dockerfile

# 使用PyTorch官方镜像,支持CUDA
FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime

# 设置工作目录
WORKDIR /app

# 安装依赖
RUN pip install --no-cache-dir fastapi uvicorn transformers

# 下载LLaMA 3模型(示例使用Hugging Face库;需替换为您的模型路径或使用环境变量)
# 注意:实际部署时,模型文件应通过卷挂载或下载脚本处理,避免镜像过大。
COPY download_model.py .
RUN python download_model.py --model_name "meta-llama/Meta-Llama-3-8B-Instruct"

# 复制API代码
COPY app.py .

# 暴露API端口
EXPOSE 8000

# 启动FastAPI服务
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

文件:download_model.py(模型下载脚本)

from transformers import AutoTokenizer, AutoModelForCausalLM
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--model_name", type=str, default="meta-llama/Meta-Llama-3-8B-Instruct")
args = parser.parse_args()

# 下载模型和tokenizer
tokenizer = AutoTokenizer.from_pretrained(args.model_name)
model = AutoModelForCausalLM.from_pretrained(args.model_name)
print(f"Model {args.model_name} downloaded successfully.")

文件:app.py(FastAPI应用)

from fastapi import FastAPI
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

app = FastAPI()

# 加载模型(在容器启动时加载一次)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")
model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct").to("cuda")

@app.post("/generate")
async def generate_text(prompt: str, max_length: int = 100):
    # 文本生成推理
    inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
    outputs = model.generate(**inputs, max_length=max_length)
    generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return {"generated_text": generated_text}

构建和测试容器:

# 构建镜像
docker build -t llama3-service .

# 运行容器(映射端口,启用GPU)
docker run -d --gpus all -p 8000:8000 --name llama_container llama3-service

# 测试API(使用curl)
curl -X POST "http://localhost:8000/generate" -H "Content-Type: application/json" -d '{"prompt": "你好,世界", "max_length": 50}'
# 预期输出:{"generated_text":"生成的文本..."}

3. Stable Diffusion容器化

Stable Diffusion是文本到图像生成模型。我们将构建另一个Docker镜像,提供图像生成API。

步骤:

  • 创建项目目录:mkdir sd_service && cd sd_service
  • 编写Dockerfile:基于PyTorch镜像,安装diffusers库,并启动API服务。

文件:Dockerfile

# 使用PyTorch官方镜像
FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime

WORKDIR /app

# 安装依赖
RUN pip install --no-cache-dir fastapi uvicorn diffusers transformers accelerate

# 下载Stable Diffusion模型(示例使用Hugging Face库)
COPY download_model.py .
RUN python download_model.py --model_name "runwayml/stable-diffusion-v1-5"

# 复制API代码
COPY app.py .

EXPOSE 8001  # 使用不同端口避免冲突

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8001"]

文件:download_model.py

from diffusers import StableDiffusionPipeline
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--model_name", type=str, default="runwayml/stable-diffusion-v1-5")
args = parser.parse_args()

# 下载模型
pipeline = StableDiffusionPipeline.from_pretrained(args.model_name)
print(f"Model {args.model_name} downloaded successfully.")

文件:app.py

from fastapi import FastAPI
from diffusers import StableDiffusionPipeline
import torch
from io import BytesIO
from PIL import Image
import base64

app = FastAPI()

# 加载模型
pipeline = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5").to("cuda")

@app.post("/generate")
async def generate_image(prompt: str, height: int = 512, width: int = 512):
    # 图像生成推理
    image = pipeline(prompt, height=height, width=width).images[0]
    # 将图像转换为Base64编码
    buffered = BytesIO()
    image.save(buffered, format="PNG")
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return {"image_base64": img_str}

构建和测试容器:

# 构建镜像
docker build -t sd-service .

# 运行容器
docker run -d --gpus all -p 8001:8001 --name sd_container sd-service

# 测试API
curl -X POST "http://localhost:8001/generate" -H "Content-Type: application/json" -d '{"prompt": "一只猫在沙滩上"}'
# 预期输出:{"image_base64":"base64编码的图像数据..."}

4. 多服务集成方案

使用Docker Compose定义和运行多个服务,实现LLaMA 3和Stable Diffusion的集成。服务间通过内部网络通信,可添加一个网关服务协调调用。

步骤:

  • 创建根目录:mkdir aigc_integration && cd aigc_integration
  • 组织目录结构:
    aigc_integration/
    ├── docker-compose.yml
    ├── llama3_service/  # 包含前述LLaMA 3的Dockerfile和代码
    ├── sd_service/      # 包含前述Stable Diffusion的Dockerfile和代码
    └── gateway/         # 可选网关服务(简化版示例)
    

文件:docker-compose.yml

version: '3.8'

services:
  llama:
    build: ./llama3_service
    image: llama3-service
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    ports:
      - "8000:8000"
    networks:
      - aigc-network

  stable_diffusion:
    build: ./sd_service
    image: sd-service
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    ports:
      - "8001:8001"
    networks:
      - aigc-network

  # 可选网关服务(示例:一个简单FastAPI服务协调调用)
  gateway:
    image: python:3.9
    working_dir: /app
    volumes:
      - ./gateway:/app
    ports:
      - "8080:8080"
    command: sh -c "pip install fastapi uvicorn requests && uvicorn app:app --host 0.0.0.0 --port 8080"
    networks:
      - aigc-network

networks:
  aigc-network:
    driver: bridge

文件:gateway/app.py(网关服务代码)

from fastapi import FastAPI
import requests

app = FastAPI()

# 定义内部服务URL(使用Docker服务名)
LLAMA_URL = "http://llama:8000/generate"
SD_URL = "http://stable_diffusion:8001/generate"

@app.post("/integrate")
async def integrate_services(text_prompt: str, image_prompt: str):
    # 调用LLaMA 3服务生成文本
    llama_response = requests.post(LLAMA_URL, json={"prompt": text_prompt, "max_length": 100})
    generated_text = llama_response.json().get("generated_text", "")
    
    # 调用Stable Diffusion服务生成图像
    sd_response = requests.post(SD_URL, json={"prompt": image_prompt})
    image_base64 = sd_response.json().get("image_base64", "")
    
    return {
        "text_output": generated_text,
        "image_output": image_base64
    }

运行和测试:

# 启动所有服务(在根目录运行)
docker compose up --build -d

# 测试网关API(假设网关端口8080)
curl -X POST "http://localhost:8080/integrate" -H "Content-Type: application/json" -d '{"text_prompt": "写一首关于AI的诗", "image_prompt": "未来城市风景"}'
# 预期输出:{"text_output":"生成的诗歌...", "image_output":"base64图像..."}

5. 优化和注意事项
  • 性能优化
    • GPU加速:确保主机安装NVIDIA驱动和nvidia-container-toolkit。在Docker Compose中,deploy.resources配置GPU。
    • 模型加载:使用卷挂载模型文件(如volumes: - ./models:/models),避免每次构建时下载。
    • 批处理:在API代码中实现批处理推理,提高吞吐量。例如,Stable Diffusion支持批量生成。
  • 资源管理
    • 设置资源限制:在docker-compose.yml中添加cpusmemory限制。
    • 监控:使用docker stats或Prometheus监控容器资源使用。
  • 安全性和扩展
    • API认证:添加API密钥验证(如JWT),避免未授权访问。
    • 扩展性:使用Kubernetes管理多容器集群,支持自动扩缩。
    • 模型更新:通过CI/CD管道自动重建镜像当模型更新时。
  • 常见问题
    • 模型大小:LLaMA 3和Stable Diffusion模型较大(数GB),确保磁盘空间充足。使用.dockerignore排除不必要文件。
    • 端口冲突:在docker-compose.yml中分配不同端口。
    • 网络延迟:如果服务间调用频繁,优化内部网络设置。

通过本方案,您可以快速部署LLaMA 3和Stable Diffusion作为多服务系统,实现文本和图像的协同生成。实际部署时,根据需求调整模型版本或添加更多服务(如语音合成)。如有问题,参考Docker文档和Hugging Face模型库。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐