使用Docker Compose部署SDPose-Wholebody微服务集群如果你正在寻找一个能精准识别人体133个关键点的姿态估计模型SDPose-Wholebody绝对值得一试。它基于Stable Diffusion的视觉先验在艺术风格、动画等非自然图像上表现尤其出色。但直接部署这个模型尤其是想在生产环境中稳定运行可能会遇到不少麻烦依赖复杂、资源占用高、单点故障风险等等。今天我就带你用Docker Compose搭建一个SDPose-Wholebody的微服务集群。这不是简单的单容器部署而是按照生产级标准设计的方案包含服务拆分、网络隔离、资源限制等实用技巧。跟着步骤走你就能得到一个高可用、易扩展的姿态估计服务。1. 为什么需要微服务化部署你可能在想不就是跑个模型吗直接装到服务器上不就行了确实可以但实际用起来会遇到几个问题。首先SDPose-Wholebody本身依赖比较多包括PyTorch、Diffusers、MMPose等手动安装容易遇到版本冲突。其次这个模型对显存要求不低直接运行可能占满你的GPU影响其他服务。最重要的是如果只有一个服务实例一旦崩溃整个姿态估计功能就瘫痪了。用Docker Compose部署微服务集群能很好地解决这些问题。每个服务独立运行在自己的容器里依赖隔离得清清楚楚。你可以控制每个容器能用多少GPU显存避免资源争抢。而且可以轻松扩展多个实例一个挂了还有其他顶上。我们的部署方案会把整个系统拆成三个核心服务detection-service负责检测图片中的人用YOLO模型找出每个人的位置pose-service核心的姿态估计服务基于SDPose-Wholebody模型api-gateway统一对外提供API接口接收请求并分发给后端服务这样的架构不仅更稳定也更容易维护和升级。2. 部署前的准备工作在开始之前确保你的环境满足以下要求。我会尽量把每一步都讲清楚即使你之前没怎么用过Docker也能跟着做下来。2.1 系统与环境要求你需要一台Linux服务器建议用Ubuntu 20.04或更高版本。关键是要有NVIDIA GPU因为SDPose-Wholebody依赖CUDA加速。显存至少8GB如果想处理高分辨率图片或同时服务多个请求建议12GB以上。先检查一下你的NVIDIA驱动和CUDA是否装好了# 检查NVIDIA驱动 nvidia-smi # 检查CUDA版本如果有的话 nvcc --version如果看到GPU信息正常输出说明驱动没问题。CUDA版本最好在11.7以上这样能兼容最新的PyTorch。2.2 安装Docker和NVIDIA Container Toolkit如果你的系统还没装Docker可以按下面步骤安装。已经有的可以跳过这部分。# 更新包列表 sudo apt-get update # 安装必要的依赖 sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加Docker仓库 echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装Docker sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io # 将当前用户加入docker组这样不用每次都sudo sudo usermod -aG docker $USER安装完Docker后还需要装NVIDIA Container Toolkit这样Docker容器才能用GPU。# 添加NVIDIA容器工具包仓库 distribution$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list # 安装nvidia-container-toolkit sudo apt-get update sudo apt-get install -y nvidia-container-toolkit # 重启Docker服务 sudo systemctl restart docker # 测试GPU是否能在Docker中使用 docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi如果最后一条命令能正常显示GPU信息说明环境配置成功了。3. 编写Docker Compose配置文件现在进入核心部分编写docker-compose.yml文件。这个文件定义了整个微服务集群的结构包括每个服务怎么构建、怎么运行、怎么互相通信。我会把配置文件分成几个部分讲解你可以先创建一个项目目录比如叫sdpose-cluster然后在这个目录下创建文件。3.1 项目目录结构建议按这样的结构组织文件sdpose-cluster/ ├── docker-compose.yml # 主配置文件 ├── detection-service/ │ ├── Dockerfile # 检测服务的Dockerfile │ ├── app.py # 检测服务的主程序 │ └── requirements.txt # Python依赖 ├── pose-service/ │ ├── Dockerfile # 姿态估计服务的Dockerfile │ ├── app.py # 姿态估计服务的主程序 │ └── requirements.txt # Python依赖 ├── api-gateway/ │ ├── Dockerfile # API网关的Dockerfile │ ├── app.py # API网关的主程序 │ └── requirements.txt # Python依赖 └── models/ # 存放下载的模型文件 ├── yolo11x.pt # YOLO检测模型 └── sdpose-wholebody/ # SDPose-Wholebody模型3.2 主docker-compose.yml文件这是整个集群的蓝图定义了三个服务和它们之间的关系。version: 3.8 services: # 检测服务 - 负责识别人体位置 detection-service: build: ./detection-service container_name: sdpose-detection restart: unless-stopped deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] environment: - MODEL_PATH/models/yolo11x.pt - PORT8001 volumes: - ./models:/models - detection-logs:/app/logs networks: - sdpose-network healthcheck: test: [CMD, curl, -f, http://localhost:8001/health] interval: 30s timeout: 10s retries: 3 start_period: 40s # 姿态估计服务 - 核心的133关键点估计 pose-service: build: ./pose-service container_name: sdpose-pose restart: unless-stopped deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] limits: memory: 8G cpus: 2.0 environment: - MODEL_PATH/models/sdpose-wholebody - DETECTION_SERVICE_URLhttp://detection-service:8001 - PORT8002 volumes: - ./models:/models - pose-logs:/app/logs depends_on: detection-service: condition: service_healthy networks: - sdpose-network healthcheck: test: [CMD, curl, -f, http://localhost:8002/health] interval: 30s timeout: 10s retries: 3 start_period: 60s # API网关 - 统一对外接口 api-gateway: build: ./api-gateway container_name: sdpose-api restart: unless-stopped ports: - 8000:8000 environment: - DETECTION_SERVICE_URLhttp://detection-service:8001 - POSE_SERVICE_URLhttp://pose-service:8002 - PORT8000 volumes: - api-logs:/app/logs depends_on: pose-service: condition: service_healthy networks: - sdpose-network # 自定义网络让服务间可以互相通信 networks: sdpose-network: driver: bridge # 数据卷用于持久化日志 volumes: detection-logs: pose-logs: api-logs:这个配置有几个关键点值得注意资源限制给pose-service设置了内存和CPU限制防止它占用过多资源健康检查每个服务都有健康检查确保服务真正可用后才启动依赖的服务自定义网络创建了独立的网络服务间通过服务名直接通信不需要知道IP地址数据卷日志持久化存储即使容器重启也不会丢失3.3 检测服务配置检测服务用YOLO模型找出图片中的人。先创建detection-service/DockerfileFROM nvidia/cuda:11.8.0-runtime-ubuntu20.04 # 设置非交互式安装避免提示 ENV DEBIAN_FRONTENDnoninteractive # 安装系统依赖 RUN apt-get update apt-get install -y \ python3.8 \ python3-pip \ curl \ rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装Python依赖 RUN pip3 install --no-cache-dir -r requirements.txt # 复制应用代码 COPY app.py . # 创建日志目录 RUN mkdir -p /app/logs # 暴露端口 EXPOSE 8001 # 启动命令 CMD [python3, app.py]然后是detection-service/requirements.txttorch2.0.0 torchvision0.15.0 ultralytics8.0.0 fastapi0.100.0 uvicorn0.23.0 pillow10.0.0 numpy1.24.0最后是detection-service/app.py这是检测服务的核心代码import os import logging from typing import List, Dict, Any import numpy as np from PIL import Image import torch from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse import uvicorn # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(/app/logs/detection.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) app FastAPI(titleDetection Service) # 全局变量存储模型 model None def load_model(): 加载YOLO检测模型 global model try: from ultralytics import YOLO model_path os.getenv(MODEL_PATH, /models/yolo11x.pt) logger.info(fLoading model from {model_path}) # 检查模型文件是否存在 if not os.path.exists(model_path): logger.error(fModel file not found: {model_path}) # 尝试下载模型 logger.info(Attempting to download model...) model YOLO(yolo11x) model.save(model_path) else: model YOLO(model_path) logger.info(Model loaded successfully) return True except Exception as e: logger.error(fFailed to load model: {str(e)}) return False app.on_event(startup) async def startup_event(): 应用启动时加载模型 if not load_model(): raise RuntimeError(Failed to load detection model) app.get(/health) async def health_check(): 健康检查端点 if model is None: return JSONResponse( status_code503, content{status: unhealthy, message: Model not loaded} ) return {status: healthy, service: detection} app.post(/detect) async def detect_humans( image: UploadFile File(...), confidence: float 0.5 ): 检测图片中的人体位置 Args: image: 上传的图片文件 confidence: 检测置信度阈值 Returns: 检测到的人体边界框列表 try: # 读取图片 contents await image.read() img Image.open(io.BytesIO(contents)).convert(RGB) # 运行检测 results model(img, confconfidence, classes[0]) # class 0 is person # 解析结果 detections [] for result in results: boxes result.boxes if boxes is not None: for box in boxes: x1, y1, x2, y2 box.xyxy[0].cpu().numpy() conf box.conf[0].cpu().numpy() detections.append({ bbox: [float(x1), float(y1), float(x2), float(y2)], confidence: float(conf), class: person }) logger.info(fDetected {len(detections)} persons) return { detections: detections, count: len(detections), image_size: img.size } except Exception as e: logger.error(fDetection failed: {str(e)}) raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: port int(os.getenv(PORT, 8001)) uvicorn.run(app, host0.0.0.0, portport)这个服务提供了两个接口/health用于健康检查/detect用于人体检测。检测结果会返回每个人的边界框坐标和置信度。3.4 姿态估计服务配置这是最核心的服务负责运行SDPose-Wholebody模型。创建pose-service/DockerfileFROM nvidia/cuda:11.8.0-runtime-ubuntu20.04 ENV DEBIAN_FRONTENDnoninteractive # 安装系统依赖 RUN apt-get update apt-get install -y \ python3.8 \ python3-pip \ git \ wget \ rm -rf /var/lib/apt/lists/* WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装Python依赖 RUN pip3 install --no-cache-dir -r requirements.txt # 复制应用代码 COPY app.py . # 创建日志目录 RUN mkdir -p /app/logs EXPOSE 8002 CMD [python3, app.py]pose-service/requirements.txt内容如下torch2.0.0 torchvision0.15.0 diffusers0.25.0 transformers4.35.0 accelerate0.24.0 fastapi0.100.0 uvicorn0.23.0 pillow10.0.0 numpy1.24.0 requests2.31.0 opencv-python4.8.0姿态估计服务的代码稍微复杂一些因为要集成SDPose-Wholebody模型。下面是pose-service/app.py的简化版本import os import io import logging import requests from typing import List, Dict, Any import numpy as np from PIL import Image import torch from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse import uvicorn # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(/app/logs/pose.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) app FastAPI(titlePose Estimation Service) # 全局变量 model None device None detection_service_url os.getenv(DETECTION_SERVICE_URL, http://detection-service:8001) def load_model(): 加载SDPose-Wholebody模型 global model, device try: # 这里需要根据实际的SDPose实现来调整 # 假设我们已经有了一个封装好的SDPose类 model_path os.getenv(MODEL_PATH, /models/sdpose-wholebody) # 设置设备 device torch.device(cuda if torch.cuda.is_available() else cpu) logger.info(fUsing device: {device}) # 实际项目中这里应该加载真正的SDPose模型 # 为了示例我们创建一个模拟的模型类 class MockSDPose: def __init__(self): self.input_size (1024, 768) self.keypoints 133 def estimate(self, image, bbox): # 模拟姿态估计 # 实际应该调用SDPose的推理代码 height, width image.shape[:2] # 生成模拟的关键点 keypoints [] for i in range(133): # 在边界框内随机生成点实际应该用模型预测 x bbox[0] (bbox[2] - bbox[0]) * np.random.random() y bbox[1] (bbox[3] - bbox[1]) * np.random.random() confidence np.random.random() * 0.5 0.5 # 0.5-1.0 keypoints.append([float(x), float(y), float(confidence)]) return { keypoints: keypoints, bbox: bbox, score: 0.9 } model MockSDPose() logger.info(fModel loaded. Input size: {model.input_size}, Keypoints: {model.keypoints}) return True except Exception as e: logger.error(fFailed to load model: {str(e)}) return False app.on_event(startup) async def startup_event(): 应用启动时加载模型 if not load_model(): raise RuntimeError(Failed to load pose estimation model) app.get(/health) async def health_check(): 健康检查端点 if model is None: return JSONResponse( status_code503, content{status: unhealthy, message: Model not loaded} ) return {status: healthy, service: pose-estimation} async def call_detection_service(image_bytes: bytes) - List[Dict]: 调用检测服务获取人体边界框 try: files {image: (image.jpg, image_bytes, image/jpeg)} params {confidence: 0.3} response requests.post( f{detection_service_url}/detect, filesfiles, paramsparams, timeout30 ) response.raise_for_status() result response.json() return result.get(detections, []) except requests.exceptions.RequestException as e: logger.error(fDetection service call failed: {str(e)}) raise HTTPException(status_code500, detailfDetection service error: {str(e)}) app.post(/estimate) async def estimate_pose( image: UploadFile File(...), estimate_wholebody: bool True ): 估计图片中所有人的姿态 Args: image: 上传的图片文件 estimate_wholebody: 是否估计全身133个关键点 Returns: 每个人的姿态估计结果 try: # 读取图片 image_bytes await image.read() img Image.open(io.BytesIO(image_bytes)).convert(RGB) img_array np.array(img) # 调用检测服务获取人体位置 detections await call_detection_service(image_bytes) if not detections: return { persons: [], count: 0, message: No persons detected } # 对每个检测到的人进行姿态估计 persons [] for i, detection in enumerate(detections): bbox detection[bbox] # 调用姿态估计模型 pose_result model.estimate(img_array, bbox) persons.append({ id: i, bbox: bbox, confidence: detection[confidence], keypoints: pose_result[keypoints], score: pose_result[score] }) logger.info(fEstimated pose for {len(persons)} persons) return { persons: persons, count: len(persons), image_size: img.size, keypoints_count: model.keypoints if estimate_wholebody else 17 } except Exception as e: logger.error(fPose estimation failed: {str(e)}) raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: port int(os.getenv(PORT, 8002)) uvicorn.run(app, host0.0.0.0, portport)注意这里的模型加载部分用了Mock类实际部署时需要替换成真正的SDPose-Wholebody模型加载代码。你可以参考SDPose官方仓库的实现。3.5 API网关配置API网关是用户访问的入口它接收请求然后调用相应的后端服务。创建api-gateway/DockerfileFROM python:3.8-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app.py . RUN mkdir -p /app/logs EXPOSE 8000 CMD [python, app.py]api-gateway/requirements.txtfastapi0.100.0 uvicorn0.23.0 requests2.31.0 pydantic2.0.0api-gateway/app.pyimport os import logging import requests from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse import uvicorn # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(/app/logs/api.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) app FastAPI(titleSDPose Wholebody API Gateway) # 后端服务地址 pose_service_url os.getenv(POSE_SERVICE_URL, http://pose-service:8002) app.get(/) async def root(): 根端点返回服务信息 return { service: SDPose Wholebody API Gateway, version: 1.0.0, endpoints: { health: /health, pose_estimation: /api/v1/pose } } app.get(/health) async def health_check(): 健康检查同时检查后端服务 try: # 检查姿态估计服务 pose_response requests.get(f{pose_service_url}/health, timeout5) pose_status pose_response.status_code 200 return { status: healthy if pose_status else degraded, services: { api_gateway: healthy, pose_service: healthy if pose_status else unhealthy } } except requests.exceptions.RequestException as e: logger.error(fHealth check failed: {str(e)}) return JSONResponse( status_code503, content{ status: unhealthy, message: Backend service unavailable } ) app.post(/api/v1/pose) async def estimate_pose( image: UploadFile File(...), estimate_wholebody: bool True ): 姿态估计接口 Args: image: 图片文件 estimate_wholebody: 是否估计全身关键点 Returns: 姿态估计结果 try: # 读取图片数据 image_data await image.read() # 准备请求文件 files {image: (image.filename, image_data, image.content_type)} params {estimate_wholebody: estimate_wholebody} # 调用姿态估计服务 response requests.post( f{pose_service_url}/estimate, filesfiles, paramsparams, timeout60 # 姿态估计可能需要较长时间 ) # 检查响应 if response.status_code ! 200: logger.error(fPose service returned error: {response.status_code}) raise HTTPException( status_coderesponse.status_code, detailresponse.json().get(detail, Pose estimation failed) ) return response.json() except requests.exceptions.Timeout: logger.error(Pose estimation timeout) raise HTTPException(status_code504, detailService timeout) except requests.exceptions.RequestException as e: logger.error(fRequest to pose service failed: {str(e)}) raise HTTPException(status_code500, detailfBackend service error: {str(e)}) except Exception as e: logger.error(fUnexpected error: {str(e)}) raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: port int(os.getenv(PORT, 8000)) uvicorn.run(app, host0.0.0.0, portport)API网关做了几件重要的事统一了API接口格式、处理了错误和超时、提供了健康检查聚合。用户只需要和网关交互不需要关心后端有多少个服务。4. 下载模型文件在启动服务之前需要下载必要的模型文件。创建download_models.sh脚本#!/bin/bash # 创建模型目录 mkdir -p models # 下载YOLO11-x模型 echo Downloading YOLO11-x model... wget -q https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x.pt -O models/yolo11x.pt # 下载SDPose-Wholebody模型 echo Downloading SDPose-Wholebody model... # 这里需要根据实际模型地址调整 # 假设从Hugging Face下载 if [ ! -d models/sdpose-wholebody ]; then mkdir -p models/sdpose-wholebody # 实际应该下载模型文件这里用占位符 echo Please download SDPose-Wholebody model manually and place in models/sdpose-wholebody/ echo Model available at: https://huggingface.co/teemosliang/SDPose-Wholebody fi echo Model download completed!给脚本执行权限并运行chmod x download_models.sh ./download_models.sh对于SDPose-Wholebody模型你可能需要从Hugging Face仓库手动下载然后放到models/sdpose-wholebody/目录下。5. 启动与测试集群所有文件都准备好后就可以启动集群了。5.1 启动服务在项目根目录运行# 启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 查看日志 docker-compose logs -f第一次运行会花一些时间构建镜像和下载依赖。如果一切顺利你会看到三个服务都处于运行状态。5.2 测试API接口服务启动后可以用curl或Postman测试接口。API网关运行在8000端口。# 健康检查 curl http://localhost:8000/health # 姿态估计需要准备一张测试图片 curl -X POST http://localhost:8000/api/v1/pose \ -H accept: application/json \ -F imagetest_image.jpg \ -F estimate_wholebodytrue如果返回了姿态估计结果说明整个集群工作正常。5.3 监控服务状态Docker Compose提供了一些有用的命令来管理集群# 查看所有容器状态 docker-compose ps # 查看特定服务的日志 docker-compose logs pose-service # 查看资源使用情况 docker stats # 重启某个服务 docker-compose restart pose-service # 扩展服务实例如果需要 docker-compose up -d --scale pose-service26. 生产环境优化建议上面的配置已经可以工作了但在生产环境中你可能还需要考虑以下优化6.1 资源限制与监控在docker-compose.yml中我们已经给pose-service设置了资源限制。你还可以根据实际情况调整pose-service: deploy: resources: limits: cpus: 4.0 memory: 16G reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] device_ids: [0] # 指定使用哪块GPU6.2 添加Redis缓存对于频繁请求的相同图片可以添加Redis缓存redis: image: redis:7-alpine container_name: sdpose-redis restart: unless-stopped volumes: - redis-data:/data networks: - sdpose-network # 然后在api-gateway中连接Redis6.3 配置负载均衡如果流量较大可以配置Nginx作为负载均衡器nginx: image: nginx:alpine container_name: sdpose-nginx ports: - 80:80 - 443:443 volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./ssl:/etc/nginx/ssl depends_on: - api-gateway networks: - sdpose-network6.4 日志收集使用ELK或Loki收集和分析日志loki: image: grafana/loki:latest container_name: sdpose-loki ports: - 3100:3100 command: -config.file/etc/loki/local-config.yaml networks: - sdpose-network promtail: image: grafana/promtail:latest container_name: sdpose-promtail volumes: - /var/log:/var/log - ./promtail-config.yaml:/etc/promtail/config.yaml command: -config.file/etc/promtail/config.yaml networks: - sdpose-network7. 常见问题与解决部署过程中可能会遇到一些问题这里列举几个常见的问题1GPU无法在Docker中使用docker: Error response from daemon: could not select device driver with capabilities: [[gpu]].解决确保安装了NVIDIA Container Toolkit并重启Docker服务。问题2模型加载失败CUDA out of memory解决调整docker-compose中的资源限制或者使用更小的模型批次。问题3服务启动顺序问题pose-service depends on detection-service but detection-service is not healthy解决增加健康检查的start_period时间给服务更多启动时间。问题4API响应慢解决考虑添加缓存、优化模型推理、或者扩展服务实例。8. 总结用Docker Compose部署SDPose-Wholebody微服务集群看起来步骤不少但实际用起来会发现很多好处。服务之间解耦了每个都可以独立升级和维护。资源使用可控不会一个服务拖垮整个系统。扩展也方便哪个服务压力大就多开几个实例。这套方案不仅适用于SDPose-Wholebody其他AI模型也可以参考类似的架构。关键是把单体应用拆分成专注特定功能的小服务然后用Docker Compose把它们组织起来。实际部署时你可能需要根据具体的硬件条件和业务需求调整配置。比如GPU内存大的话可以调高batch size提升性能。流量大的话可以考虑加上负载均衡和自动扩缩容。部署完成后记得定期监控服务状态和资源使用情况。日志也要好好管理这样出问题时能快速定位。如果要在生产环境用安全方面也要多考虑比如API认证、传输加密这些。整体来说微服务化是AI模型部署的一个不错的方向特别是对于像SDPose-Wholebody这样有一定复杂度的模型。希望这个教程能帮你顺利部署自己的姿态估计服务。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。