SuperAPI AI 工具集

modal

部署与运维

查看项目

更新于 10-15 08:33

技能介绍

Modal 是一个无服务器平台,用于在云端以极简配置运行 Python 代码。它支持在强大的 GPU 上执行函数、自动扩展到数千个容器,并按实际使用的计算量计费。Modal 特别适用于 AI/ML 工作负载、高性能批处理、定时任务、GPU 推理和无服务器 API。可在 https://modal.com 免费注册并获得每月 $30 额度。

用途

  • 部署和提供 ML 模型(LLM、图像生成、嵌入模型)
  • 运行 GPU 加速计算(训练、推理、渲染)
  • 并行批处理大规模数据集
  • 调度计算密集型任务(每日数据处理、模型训练)
  • 构建需要自动扩展的无服务器 API
  • 需要分布式计算或专用硬件的科学计算

认证与设置 Modal 需要通过 API 令牌认证。初始设置:

安装 Modal

uv uv pip install modal

认证(打开浏览器登录)

modal token new 这会在 ~/.modal.toml 中创建令牌,所有 Modal 操作均通过该令牌认证。验证设置: import modal app = modal.App("test-app") @app.function() def hello(): print("Modal is working!") 运行方式:modal run script.py

主要能力 Modal 通过运行在容器中的 Functions 提供无服务器 Python 执行。可以声明式地定义计算需求、依赖和扩展行为。

  1. 定义容器镜像:使用 Modal Images 指定函数的依赖和环境。示例:image = (modal.Image.debian_slim(python_version="3.12").uv_pip_install("torch", "transformers", "numpy"));app = modal.App("ml-app", image=image)。常见模式包括安装 Python 包 .uv_pip_install("pandas", "scikit-learn")、安装系统包 .apt_install("ffmpeg", "git")、使用现有 Docker 镜像 modal.Image.from_registry("nvidia/cuda:12.1.0-base")、添加本地代码 .add_local_python_source("my_module")。

  2. 创建函数:使用 @app.function() 装饰器定义在云端运行的函数。可从本地入口点调用:@app.local_entrypoint() def main(): result = process_data.remote("data.csv")。

  3. 请求 GPU:为函数附加 GPU 以加速计算,如 @app.function(gpu="H100")。可用 GPU 类型:T4、L4(高性价比推理)、A10、A100、A100-80GB(标准训练/推理)、L40S(48GB,性价比优秀)、H100、H200(高性能训练)、B200(旗舰性能)。可请求多 GPU:@app.function(gpu="H100:8")。

  4. 配置资源:请求 CPU 核心、内存和磁盘,如 @app.function(cpu=8.0, memory=32768, ephemeral_disk=10240)。默认分配 0.125 CPU 核心、128 MiB 内存。计费基于预留或实际使用中的较高者。

  5. 自动扩展:Modal 根据需求将函数从零自动扩展到数千个容器。可并行处理输入:analyze_sample.map(sample_ids)。可配置自动扩展:@app.function(max_containers=100, min_containers=2, buffer_containers=5)。

  6. 持久存储数据:使用 Volumes 在函数调用之间持久化存储。volume = modal.Volume.from_name("my-data", create_if_missing=True);通过 volumes={"/data": volume} 挂载,写入后调用 volume.commit() 持久化更改。

  7. 管理密钥:使用 Modal Secrets 安全存储 API 密钥和凭据。如 @app.function(secrets=[modal.Secret.from_name("huggingface")]),通过 os.environ["HF_TOKEN"] 读取。可在 Modal 仪表板或 CLI 创建:modal secret create my-secret KEY=value API_TOKEN=xyz。

  8. 部署 Web 端点:使用 @modal.web_endpoint() 提供 HTTP 端点、API 和 webhook,如 @modal.web_endpoint(method="POST")。部署命令:modal deploy script.py。Modal 提供 HTTPS URL。

  9. 调度任务:使用 cron 表达式按计划运行函数,如 @app.function(schedule=modal.Cron("0 2 * * *")) 每日凌晨 2 点运行,或 @app.function(schedule=modal.Period(hours=4)) 每 4 小时运行。

常见工作流

  • 部署 ML 模型进行推理:定义依赖镜像,构建时下载模型,使用 @app.cls(gpu="L40S") 加载模型并提供预测方法。
  • 批处理大规模数据集:定义处理单个文件的函数,使用 .map() 自动跨容器并行化处理数千文件。
  • 在 GPU 上训练模型:使用 @app.function(gpu="A100:2", timeout=3600) 进行多 GPU 训练。

最佳实践

  • 在 .uv_pip_install() 中固定依赖版本以实现可复现构建
  • 使用合适的 GPU 类型——L40S 用于推理,H100/A100 用于训练
  • 利用缓存——使用 Volumes 存储模型权重和数据集
  • 配置自动扩展——根据工作负载设置 max_containers 和 min_containers
  • 如果包在本地不可用,在函数体内导入
  • 使用 .map() 进行并行处理而非顺序循环
  • 安全存储密钥——切勿硬编码 API 密钥
  • 监控成本——查看 Modal 仪表板的使用和计费

故障排查

  • "Module not found" 错误:通过 .uv_pip_install("package-name") 添加包,或在函数体内导入。
  • GPU 未检测到:验证 GPU 规格 @app.function(gpu="A100"),检查 torch.cuda.is_available()。
  • 函数超时:增加 timeout,如 @app.function(timeout=3600),默认超时 5 分钟。
  • Volume 更改未持久化:写入后调用 volume.commit(),验证卷在函数装饰器中正确挂载。

更多帮助参见 Modal 文档 https://modal.com/docs 或加入 Modal Slack 社区。

限制:关于具体定价、平台可用性、效果或未在上述资料中明确说明的使用步骤,资料暂未提供。