MedGemma 1.5快速部署:GitHub Actions自动化构建私有Docker镜像流程
1. 项目概述
MedGemma 1.5是一个基于Google MedGemma-1.5-4B-IT架构的本地医疗AI问答系统。这个系统专门设计用于医学咨询、病理分析和医学术语解释,能够在完全离线的环境中提供接近专家级的医疗逻辑推理能力。
核心价值亮点:
- 完全本地运行:所有数据处理和推理都在本地GPU上完成,无需联网
- 医疗隐私保护:所有病历文本和咨询记录100%驻留于本地显存与硬盘
- 透明推理过程:独有的思维链技术让用户可以看到完整的诊断逻辑路径
- 专业医学知识:基于海量医学文献训练,提供可靠的医疗辅助建议
这个系统特别适合医疗机构、医学研究人员以及需要保护患者隐私的医疗应用场景。
2. 环境准备与基础配置
在开始自动化构建之前,我们需要先准备好基础环境。以下是部署MedGemma 1.5的系统要求:
2.1 系统要求
硬件要求:
- GPU:NVIDIA GPU with 8GB+ VRAM (推荐RTX 3080或更高)
- 内存:16GB RAM minimum
- 存储:20GB可用空间
软件依赖:
- Docker Engine 20.10+
- NVIDIA Container Toolkit
- Python 3.8+ (用于本地测试)
- Git (用于代码管理)
2.2 本地开发环境设置
首先在本地创建项目结构:
# 创建项目目录 mkdir medgemma-deployment cd medgemma-deployment # 初始化Git仓库 git init git branch -M main # 创建项目结构 mkdir -p src/models scripts/configs touch Dockerfile docker-compose.yml .dockerignore touch requirements.txt config.yaml3. Docker镜像配置详解
3.1 Dockerfile配置
以下是MedGemma 1.5的Dockerfile配置,这是自动化构建的核心:
FROM nvidia/cuda:11.8-runtime-ubuntu22.04 # 设置环境变量 ENV DEBIAN_FRONTEND=noninteractive ENV PYTHONUNBUFFERED=1 ENV MODEL_NAME=MedGemma-1.5-4B-IT ENV PORT=6006 # 安装系统依赖 RUN apt-get update && apt-get install -y \ python3.10 \ python3-pip \ python3.10-venv \ git \ wget \ && rm -rf /var/lib/apt/lists/* # 创建应用目录 WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt # 复制应用代码 COPY src/ ./src/ COPY scripts/ ./scripts/ COPY config.yaml . # 创建模型下载脚本 RUN echo '#!/bin/bash\n\ wget -O /app/models/medgemma-1.5-4b-it.tar.gz https://example.com/models/medgemma-1.5-4b-it.tar.gz\n\ tar -xzf /app/models/medgemma-1.5-4b-it.tar.gz -C /app/models/\n\ rm /app/models/medgemma-1.5-4b-it.tar.gz' > /app/scripts/download_model.sh RUN chmod +x /app/scripts/download_model.sh # 暴露端口 EXPOSE 6006 # 启动命令 CMD ["python3", "src/app.py", "--port", "6006", "--model-path", "/app/models"]3.2 Docker Compose配置
为了方便本地测试,我们创建docker-compose.yml文件:
version: '3.8' services: medgemma: build: . container_name: medgemma-1.5 ports: - "6006:6006" environment: - NVIDIA_VISIBLE_DEVICES=all - NVIDIA_DRIVER_CAPABILITIES=compute,utility volumes: - ./models:/app/models - ./logs:/app/logs deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] restart: unless-stopped4. GitHub Actions自动化构建流程
4.1 创建GitHub Actions工作流
在项目根目录创建.github/workflows/docker-build.yml文件:
name: Build and Push Docker Image on: push: branches: [ main ] tags: [ 'v*' ] pull_request: branches: [ main ] env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: build-and-push: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata for Docker id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max4.2 添加模型下载脚本
创建模型下载和管理脚本scripts/setup_model.py:
#!/usr/bin/env python3 """ MedGemma模型下载和验证脚本 """ import os import requests import hashlib import tarfile from pathlib import Path def download_file(url, destination): """下载文件并显示进度""" Path(destination).parent.mkdir(parents=True, exist_ok=True) response = requests.get(url, stream=True) total_size = int(response.headers.get('content-length', 0)) with open(destination, 'wb') as f: downloaded = 0 for data in response.iter_content(chunk_size=8192): downloaded += len(data) f.write(data) progress = (downloaded / total_size) * 100 print(f"下载进度: {progress:.1f}%", end='\r') print("\n下载完成!") def verify_checksum(file_path, expected_checksum): """验证文件校验和""" sha256_hash = hashlib.sha256() with open(file_path, "rb") as f: for byte_block in iter(lambda: f.read(4096), b""): sha256_hash.update(byte_block) actual_checksum = sha256_hash.hexdigest() return actual_checksum == expected_checksum def main(): model_url = "https://your-model-repository/medgemma-1.5-4b-it.tar.gz" expected_checksum = "abc123def456..." # 替换为实际的校验和 model_dir = Path("models") model_path = model_dir / "medgemma-1.5-4b-it.tar.gz" extract_dir = model_dir / "medgemma-1.5-4b-it" # 下载模型 print("开始下载MedGemma模型...") download_file(model_url, model_path) # 验证文件完整性 print("验证文件完整性...") if verify_checksum(model_path, expected_checksum): print("文件校验通过!") else: print("文件校验失败! 请重新下载。") return # 解压模型 print("解压模型文件...") with tarfile.open(model_path, 'r:gz') as tar: tar.extractall(path=extract_dir) # 清理临时文件 model_path.unlink() print("模型设置完成!") if __name__ == "__main__": main()5. 本地测试与验证
5.1 本地构建测试
在推送代码到GitHub之前,先在本地测试Docker构建:
# 构建Docker镜像 docker build -t medgemma-1.5 . # 测试运行 docker run -it --rm \ --gpus all \ -p 6006:6006 \ -v $(pwd)/models:/app/models \ medgemma-1.5 # 或者使用docker-compose docker-compose up -d docker-compose logs -f5.2 功能验证脚本
创建测试脚本验证MedGemma功能:
#!/usr/bin/env python3 """ MedGemma功能验证脚本 """ import requests import json import time def test_medgemma_api(): base_url = "http://localhost:6006" # 测试健康检查 try: response = requests.get(f"{base_url}/health") if response.status_code == 200: print(" 健康检查通过") else: print(" 健康检查失败") return False except: print(" 无法连接到服务") return False # 测试医学问答 test_cases = [ "什么是高血压?", "What are the side effects of aspirin?", "糖尿病有哪些并发症?" ] for question in test_cases: try: response = requests.post( f"{base_url}/api/ask", json={"question": question}, timeout=30 ) if response.status_code == 200: result = response.json() print(f" 问题: {question}") print(f" 回答: {result['answer'][:100]}...") if 'thinking_process' in result: print(f" 思维链: {result['thinking_process'][:100]}...") else: print(f" 问题失败: {question}") return False time.sleep(2) # 避免请求过快 except Exception as e: print(f" 请求异常: {e}") return False return True if __name__ == "__main__": if test_medgemma_api(): print("\n 所有测试通过!MedGemma运行正常") else: print("\n 测试失败,请检查服务状态")6. 自动化部署优化
6.1 多阶段构建优化
优化Dockerfile使用多阶段构建,减少镜像大小:
# 第一阶段:构建环境 FROM nvidia/cuda:11.8-devel-ubuntu22.04 as builder ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y python3.10 python3-pip WORKDIR /app COPY requirements.txt . RUN pip3 install --user -r requirements.txt # 第二阶段:运行环境 FROM nvidia/cuda:11.8-runtime-ubuntu22.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y python3.10 && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY --from=builder /root/.local /root/.local COPY src/ ./src/ COPY scripts/ ./scripts/ COPY config.yaml . ENV PATH=/root/.local/bin:$PATH ENV PYTHONPATH=/app EXPOSE 6006 CMD ["python3", "src/app.py"]6.2 GitHub Actions缓存优化
添加缓存优化到GitHub Actions工作流:
- name: Cache Docker layers uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - name: Set up build cache uses: docker/build-push-action@v5 with: context: . load: true cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max - name: Move cache run: | rm -rf /tmp/.buildx-cache mv /tmp/.buildx-cache-new /tmp/.buildx-cache7. 总结
通过本文介绍的GitHub Actions自动化构建流程,你可以实现MedGemma 1.5医疗AI系统的快速部署和持续集成。这个方案提供了以下优势:
主要优势:
- 完全自动化:代码推送后自动构建和测试Docker镜像
- 版本控制:每个Git标签对应一个可追溯的Docker镜像版本
- 快速部署:本地测试通过后,可以快速部署到生产环境
- 资源优化:多阶段构建和缓存机制显著减少构建时间和镜像大小
实践建议:
- 在本地充分测试Docker构建和功能验证
- 设置合适GitHub仓库 secrets 用于容器 registry 认证
- 根据实际网络环境调整模型下载策略
- 定期更新基础镜像以获得安全更新和性能改进
这个自动化流程不仅适用于MedGemma,也可以作为其他AI模型Docker化部署的参考模板。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。