news 2026/9/30 6:50:00

5 个命令掌握 Cog CLI:把 Python 模型项目变成可部署的容器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5 个命令掌握 Cog CLI:把 Python 模型项目变成可部署的容器

5 个命令掌握 Cog CLI:把 Python 模型项目变成可部署的容器

【免费下载链接】cogContainers for machine learning项目地址: https://gitcode.com/GitHub_Trending/co/cog

想把 Python 模型变成稳定的 API 服务,你要对付三件事:环境、依赖、入口。Cog CLI 就是这套工作的编排入口:你只需写cog.yaml和run.py,构建、起容器、推 registry 剩下的事交给它。

先立原则:Cog 从不在宿主机跑模型代码

所有会执行模型代码的命令(cog run、cog serve、cog exec)都遵循同一个节奏:先构建镜像、再启动容器、最后通过 HTTP 向容器内的 Prediction API 发请求。setup()与run()只发生在与cog.yaml声明的依赖、CUDA 版本严格一致的容器化环境里,宿主机只是编排者。三层链路如下:

还有一点值得提前知道:输入输出 Schema 是从模型源码的类型注解静态生成的(见 architecture/02-schema.md),校验在建镜像之前就完成;镜像上会把这个 schema 写成 label,之后凭镜像做校验时无需启动容器。

🚀 起步:cog init 在当前目录生成什么

cog init

它会落盘两个文件:cog.yaml(带默认值的环境配置:python 版本、gpu 开关、requirements 路径等)和run.py(Runner骨架类,setup()一次性加载模型,run()处理单次请求,输入可带Input(description=..., ge=0, le=10, default=1.5)这类约束)。

实现细节值得记住(见 pkg/cli/init.go):

  • 模板用 Go 的//go:embed init-templates/**/*内嵌进二进制,离线也能用
  • 已存在的文件一律跳过,打印Skipped existing ...,绝不覆盖你写过的代码
  • AGENTS.md会优先在线拉取最新版,失败时回退到内嵌版本

🧪 本地验证:cog run、cog exec、cog serve 三件套

你想做什么用哪条命令
跑一次预测拿结果cog run -i prompt="a photo of a cat"
排查容器内依赖、CUDA 可用性cog exec python -c "import torch; print(torch.cuda.is_available())"
起 HTTP 服务给前端或 curl 联调cog serve
交互式进模型环境cog exec bash

cog run 用法:四类输入怎么传,输出怎么读

cog run在 pkg/cli/run.go 里只是极薄封装,执行逻辑集中在 pkg/cli/predict.go 的cmdPredict。一次 run 的走法是:静态生成 Schema(或从已有镜像 label 读取)→ 解析并校验-i参数 → 构建镜像(仅本地源码路径)→ 启动容器 → 发预测请求并把输出流式写到终端。输入类型按 Schema 推断,共四种:

# 字符串 / 数字 cog run -i prompt="a cat" -i steps=50 # 文件:@ 前缀,CLI 读取本地文件转成 base64 data URL 上传 cog run -i image=@examples/hello-replicate/cat.png -o out.png # URL cog run -i image=https://example.com/photo.jpg

输出按类型呈现:字符串原样打印;Path或list[Path]落盘(多条时按out.0.png、out.1.png命名);整数、浮点、布尔给原始值;列表与对象输出缩进 JSON。-o指定写入路径;预测失败时进程以非零码退出。批量输入用--json @inputs.json(@-读 stdin),与-i互斥。--setup-timeout默认 300 秒,约束容器 setup 时长。

用 cog exec 排查容器依赖

cog exec基于cog.yaml构建镜像后在其中运行你的命令。第一个参数之后的内容全部原样传给容器内命令(flags.SetInterspersed(false)保证),复杂命令的引号问题由此消失。工作目录设为/src并挂载源码目录,所以cog exec python train.py能直接看到项目文件。常用参数:

  • -e HUGGING_FACE_HUB_TOKEN=abc123:注入环境变量
  • --gpus:格式同docker run --gpus
  • -p:发布端口,支持8888(跑 Jupyter)、0.0.0.0:8000、[::1]:8000三种写法

cog serve 本地调试:记住两个端口

cog serve构建镜像后启动一个兼容 Cog HTTP 协议的 REST 服务,暴露POST /predictions、/openapi.json、/health-check三个端点。

端口约定是最容易踩的坑:容器内服务固定监听5000(进程为python -m cog.server.http),宿主机默认发布8393。所以访问地址是http://localhost:8393,不是 5000:

cog serve curl http://localhost:8393/predictions -X POST \ -H 'Content-Type: application/json' -d '{"input": {"prompt": "a cat"}}'
  • -p 9000:改宿主机端口
  • --host 0.0.0.0:默认127.0.0.1仅本机可达,改后允许外部访问
  • --upload-url:文件输出的上传地址,设置后自动附加host.docker.internal:host-gateway便于容器回连宿主机

另一个优点:源码走运行时卷挂载而非COPY . /src,改cog.yaml或模型代码不用重建镜像,其余各层与cog build共享缓存(见 pkg/cli/serve.go)。

🏭 镜像生产:cog build 的六步走

cog build -t my-model:latest

一次 build 按六步执行:

  1. 解析cog.yaml——pkg/config/ 负责,含 CUDA/cuDNN 与 PyTorch 兼容矩阵
  2. 依据 pkg/config/cuda_compatibility.json 解析 CUDA 版本
  3. 静态生成 OpenAPI Schema——pkg/schema/ 用 tree-sitter 解析 Python 类型注解
  4. 生成 Dockerfile——pkg/dockerfile/standard_generator.go 同时做基础镜像选择
  5. 经 Docker/BuildKit 构建镜像
  6. 向镜像写入 schema、config、pip freeze 等 label

场景 → 开关对照:

场景开关
不用构建缓存--no-cache
权重拆到独立层单独上传--separate-weights
控制进度格式--progress auto/tty/plain/quiet(环境变量BUILDKIT_PROGRESS可覆盖默认值)
构建期传密钥--secret id=foo,src=/path/to/file
用文件指定 schema--openapi-schema
换纯 Python 基础镜像--use-cuda-base-image=false(镜像更小,非 torch 项目可能出问题)
用预构建 Cog 基础镜像加快冷启动--use-cog-base-image(默认 true)
自带 Dockerfile / 可复现构建 / 剥符号 / 预编译--dockerfile、--timestamp、--strip、--precompile(均为隐藏参数)

两条硬规则:

  • --use-cog-base-image、--use-cuda-base-image、--dockerfile三者互斥,同时设两个直接报错(checkMutuallyExclusiveFlags校验)
  • 镜像命名优先级:-t标签 >cog.yaml的image字段 >model字段 > 基于项目目录的默认名

cog run、cog serve、cog exec、cog push共用同一套构建开关,这里讲一次,后文直接引用。

📦 发布上线:cog login 与 cog push

cog login cog push r8.im/your-username/my-model --separate-weights

cog login按 registry 主机挑选 provider(pkg/cli/login.go):r8.im走 token 流程,CI 场景可用cog login --token-stdin < token.txt;其他 registry 提示输入用户名密码,凭证存入 Docker 的 credential 系统。主机可用全局--registry参数或COG_REGISTRY_HOST环境变量覆盖。

cog push(pkg/cli/push.go)分四步:

  1. validatePushArgs先行校验——COG_MODEL/COG_MODEL_TAG与cog.yaml里model/image设置的冲突在耗时数分钟的构建前几秒内报出
  2. 走与cog build相同的构建路径
  3. provider.DefaultRegistry().ForImage(target)选定 Replicate 或通用 OCI 实现(pkg/provider/)
  4. resolver.Push()推送镜像及分离的权重层;成功后 provider 负责错误格式化与模型 URL 输出,CLI 打印 digest 固定的引用树:model/image/weight各行,可直接复制

构建开关沿用 build 一节(--no-cache、--secret、--use-cuda-base-image等),不再重复。--separate-weights是 Replicate 专属能力:权重层独立推送,权重未变时无需重传整个镜像。

🛠️ 出问题时:隐藏命令与自愈机制

cog --help只展示了一部分命令,以下命令存在但隐藏:

  • cog debug——只生成并打印 Dockerfile 不实际构建(pkg/cli/debug.go),适合排查基础镜像与层的问题
  • cog weights——实验性权重管理,含import/pull/status:把cog.yaml中的权重源打包为 OCI 层、更新weights.lock并推送 registry,之后cog run可直接挂载权重
  • cog predict——旧预测命令,等价于cog run且支持直接指定已构建镜像,调用时打印"cog predict" is deprecated, use "cog run"
  • cog train——向/trainings端点发训练请求

两个自愈机制值得记住:

  • GPU 驱动回退:--gpus未指定而模型需要 GPU 时,CLI 自动以gpus=all启动;若因缺设备驱动失败,打印Missing device driver, re-trying without GPU并去掉 GPU 参数重试。run、serve、exec 三处逻辑一致
  • RUST_LOG 透传:宿主机设了RUST_LOG会自动注入容器,方便调试容器内 Rust coglet 的日志

仓库 integration-tests/tests/ 用 txtar 格式覆盖了这些 CLI 行为。想核对上文流程可看:input_validation_before_build.txtar证明输入校验发生在构建之前,doctor_predict_to_run_migration.txtar覆盖旧 predict 向 run 的迁移,union_input_cli.txtar覆盖联合类型输入。

幕后机制:CLI 与容器如何协作

本地源码预测的完整时序:

容器内部的进程间通信细节见 architecture/04-container-runtime.md。入口 cmd/cog/cog.go 很薄:创建根命令后Execute(),错误统一交给console.Fatalf。根命令(pkg/cli/root.go)注册全部子命令,PersistentPreRun处理--debug日志级别、--no-color(同时写入NO_COLOR环境变量)与版本更新检查;cobra.EnableTraverseRunHooks保证根→子的钩子顺序执行。

源码地图按职责分三组:

  • 核心:pkg/cli/(Cobra 命令定义)、pkg/config/(cog.yaml 解析与兼容矩阵)、pkg/image/(构建编排)、pkg/dockerfile/(Dockerfile 生成与基础镜像选择)、pkg/docker/(Docker 客户端)、pkg/predict/(预测执行与 input.go 输入转换)、pkg/schema/(静态 Schema)、pkg/wheels/(SDK 与 coglet wheel 解析)
  • 基础设施:pkg/provider/(registry 行为抽象)、pkg/registry/(OCI registry 客户端)、pkg/model/(OCI 工件领域模型,含 resolver.go 的构建/拉取编排)、pkg/weights/(权重发现与 lockfile)、pkg/errors/(带错误码的 CodedError)
  • 工具:pkg/dotcog/(.cog/状态目录)、pkg/requirements/(requirements.txt 解析)、pkg/util/(控制台、MIME、版本)、pkg/update/(版本更新检查)、pkg/global/(进程级配置)

下一步验证

与其相信文章,不如亲手跑通:

  • 空目录里执行cog init,对照检查生成的cog.yaml与run.py
  • 在 examples/blur/ 下跑cog run -i image=@examples/blur/examples/kodim24.png,或改用cog serve后curl http://localhost:8393/openapi.json
  • 浏览 integration-tests/ 的 txtar 用例与其harness/目录,看集成测试如何驱动各命令
  • 阅读源码调用链:入口 architecture/06-cli.md,再顺 architecture/03-prediction-api.md 与 architecture/04-container-runtime.md 深入

【免费下载链接】cogContainers for machine learning项目地址: https://gitcode.com/GitHub_Trending/co/cog

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 6:48:46

正交的 React 组件:用正交性重构组件边界,让取数与 UI 彻底解耦

文档技术博客教程 【免费下载链接】weekly 前端精读周刊。帮你理解最前沿、实用的技术。 项目地址&#xff1a; https://gitcode.com/GitHub_Trending/we/weekly 点击查看 免费下载 本文是前端精读周刊对《The Benefits of Orthogonal React Components》一文的深度解读&#…

作者头像 李华
网站建设 2026/9/30 6:48:36

基于微信小程序的民宿短租系统

选题背景与研究意义近年来&#xff0c;民宿行业依托共享经济模式迅猛发展&#xff0c;成为传统酒店业的重要补充。其个性化服务、本地化体验和性价比优势吸引了大量年轻用户群体。数据显示&#xff0c;2022年中国在线民宿市场交易规模突破300亿元&#xff0c;但行业仍面临信息化…

作者头像 李华
网站建设 2026/9/30 6:48:34

大麦网抢票脚本:10 分钟改好 3 个参数,跑通自动抢购流程

大麦网抢票脚本&#xff1a;10 分钟改好 3 个参数&#xff0c;跑通自动抢购流程 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 这是一款用 Python Selenium 写的大麦网抢票…

作者头像 李华
网站建设 2026/9/30 6:47:51

HowToCook 尖椒炒牛肉指南:腌制滑嫩与大火快炒的完整实操手册

文档教程 【免费下载链接】HowToCook Programmers guide about how to cook at home. 项目地址&#xff1a; https://gitcode.com/GitHub_Trending/ho/HowToCook 点击查看 免费下载 本篇技术指南以开源菜谱仓库 HowToCook 中的尖椒炒牛肉.md为核心&#xff0c;系统讲解这道咸香…

作者头像 李华