EcoCompute · Notes

EcoCompute 容器数据测量 · 中文使用手册

2026-08-18 · Hongping Zhang · 容器复现指南 / Container how-to

本手册教你如何用 EcoCompute energy MLCube 容器,在你自己的 GPU 上复现能耗测量,并把结果叠加到 quantenergy.tech 的交叉曲线上。

我最想要的是一个「打脸」的结果。目前所有数字都出自一个人手里的几张卡,复现页上独立复现数为 0。与曲线不一致的测量比再多一次自证有价值得多;审核只看格式与 schema,从不因为结论不合我意而拒稿。

1 · 这个容器是干什么的

它做一件很单纯的事:对你的 GPU × 模型 × 精度 组合做一次真实测量。

单位说明:energy_per_token_mj每个 token 的毫焦(mJ/token,等价于每 1000 token 的焦耳);站点图表把它换算成「每 100 万 token」显示。vs_fp16_energy_pct(ΔE%)是相对同模型 FP16 基线的能耗变化,正=更费电,负=更省电。

2 · 准备条件

方式需要什么
有 Docker(推荐)Docker + 一张 NVIDIA GPU + NVIDIA Container Toolkit(让 --gpus 可用)
无 Docker(租卡)AutoDL / vast.ai 等租来的 GPU;只需 gitpython3,脚本会自动建 venv
从源码Docker 或 Python 环境 + 能 git clone 仓库

没有 NVIDIA GPU 也能「跑完」:容器会退回到公开数据集的参考值,但报告里会明确标成 basis ≠ "measured"——那不是测量,别拿去发布。

3 · 三种运行方式

方式一:有 Docker —— 一行命令(最推荐)

不用下载脚本、不用执行任何脚本,直接跑预构建镜像,命令完全透明:

docker run --rm --gpus all --user "$(id -u):$(id -g)" \
  -e HOME=/workspace/models/.hf -e HF_HOME=/workspace/models/.hf \
  -v "$PWD/ecocompute-out:/workspace/outputs" \
  -v "$HOME/.cache/ecocompute-hf:/workspace/models/.hf" \
  ghcr.io/hongping-zh/ecocompute-mlcube:latest \
  energy_estimate --model TinyLlama/TinyLlama-1.1B-Chat-v1.0 \
  --params_b 1.1 --precision NF4 --gpu_arch auto \
  --iterations 10 --warmup 2 --output_dir /workspace/outputs --share

方式二:无 Docker(AutoDL / vast.ai 等租卡)—— 一行 bootstrap

租卡环境通常不能嵌套 Docker,用这一行会自动克隆仓库、在数据盘上建 venv 并运行:

curl -fsSL https://raw.githubusercontent.com/hongping-zh/ecocompute-mlcube/main/quickstart.sh | bash

耗时要说实话:测量本身几分钟,第一次的时间几乎全在下载。我们唯一完整计时过的一次是租来的 4090、native 模式、57 分钟(约 2 GB 模型 5.5 分钟,其余是 ~3 GB 的 torch/CUDA wheel)。缓存全热之后同机重跑是 1 分 48 秒。docker 路径我们没计过时,就不编一个数字给你。

方式三:从源码(完全可控)

git clone https://github.com/hongping-zh/ecocompute-mlcube.git
cd ecocompute-mlcube

# A) 用 MLCommons MLCube CLI
pip install mlcube mlcube-docker
mlcube run --mlcube=. --task=energy_estimate --platform=docker

# B) 直接调入口(这里显式钉了架构,仅作演示;平时用 auto)
python3 entrypoint.py energy_estimate \
  --model TinyLlama/TinyLlama-1.1B-Chat-v1.0 \
  --precision NF4 --gpu_arch blackwell --params_b 1.1 \
  --output_dir workspace/outputs --prefetch --share
cat workspace/outputs/energy.json

--prefetch 会在测量前先问站点的预测值并打印出来,好让你当场看到「我的曲线在你的卡上准不准」;--share 给出可分享的叠加链接。另有一份 CPU-only 描述符(mlcube.cpu.yaml),没有 GPU 也能验证整条链路是否通。

4 · 常用参数

先说一个容易踩的坑:ECOCOMPUTE_* 环境变量只有 quickstart.shentrypoint.py 一个环境变量都不读,所以在 docker run 或直接调入口时,请用命令行参数(--precision 等);在 docker run 前面加 ECOCOMPUTE_PRECISION=INT8没有效果的。

环境变量(仅 quickstart.sh

变量作用(默认值)
ECOCOMPUTE_MODELHuggingFace 模型 id(TinyLlama/TinyLlama-1.1B-Chat-v1.0)
ECOCOMPUTE_PARAMS_B模型参数量,单位 B,必须与模型匹配(1.1)
ECOCOMPUTE_PRECISIONNF4INT8(NF4;FP16 基线始终也会测)
ECOCOMPUTE_ITERATIONS解码运行次数(10,与已发布数据集一致)
ECOCOMPUTE_MODE强制 dockernative(有 Docker 用 docker,否则 native)
ECOCOMPUTE_QUALITY0 关掉困惑度探针(默认开)
ECOCOMPUTE_PREFETCH1 先取站点预测值再测(默认关;这是唯一会联网访问本站的行为)
ECOCOMPUTE_ALLOW_FALLBACK1:量化后端坏掉时也照跑(报告将不是测量)
ECOCOMPUTE_OUT / ECOCOMPUTE_CACHE输出目录(./ecocompute-out)/模型缓存($HOME/.cache/ecocompute-hf
ECOCOMPUTE_GPU_ARGSDocker 的 GPU 参数(--gpus all;指定某卡:--gpus "device=1"
ECOCOMPUTE_IMAGE / ECOCOMPUTE_NO_BUILD镜像地址/拉取失败时直接报错而不本地构建
ECOCOMPUTE_SRCnative 模式的代码检出目录(默认放数据盘)
ECO_PYTHON / ECO_RECREATE_VENV / ECO_KEEP_PINS指定解释器/重建 venv/不为修复而离开发布钉版

命令行参数(energy_estimate 子命令)

--model · --params_b · --precision · --gpu_archauto 或具体架构)· --batch_size · --tokens · --iterations · --warmup · --sample_rate_hz · --output_dir · --share · --prefetch · --no_quality_probe · --quality_text 你自己的文本 · --quality_seq_len · --dry_run(强制无 GPU 参考路径)。

示例:换 INT8、指定第 1 号卡(注意精度是用参数给的):

docker run --rm --gpus "device=1" --user "$(id -u):$(id -g)" \
  -e HOME=/workspace/models/.hf -e HF_HOME=/workspace/models/.hf \
  -v "$PWD/ecocompute-out:/workspace/outputs" \
  -v "$HOME/.cache/ecocompute-hf:/workspace/models/.hf" \
  ghcr.io/hongping-zh/ecocompute-mlcube:latest \
  energy_estimate --model TinyLlama/TinyLlama-1.1B-Chat-v1.0 \
  --params_b 1.1 --precision INT8 --gpu_arch auto \
  --iterations 10 --warmup 2 --output_dir /workspace/outputs --share

5 · 输出说明(energy.json)

结果写在 ECOCOMPUTE_OUT/energy.json(默认 ./ecocompute-out/energy.json),并额外生成 share_url.txt。最关键的字段:

运行结束的打印示例(数值取自我们 2026 年 7 月那次真实的 RTX 4090 运行;quality 行是新增的,那次运行还没有):

  GPU            : NVIDIA GeForce RTX 4090 (ada)
  Workload       : TinyLlama/TinyLlama-1.1B-Chat-v1.0  NF4  batch 1
  Energy/token   : 1883.91 mJ  (FP16 baseline 1619.68 mJ)
  vs FP16        : +16.3 %
  Basis          : measured   (source: direct-nvml)
  Quality (ppl)  : 12.4831 vs FP16 12.3016  (+1.475%)
  Software       : python 3.10.12, torch 2.5.1+cu121, transformers 4.57.6, bitsandbytes 0.43.3

关于困惑度这一栏怎么读

6 · 把结果叠加到网站曲线

两种方式,都不上传任何数据:

  1. 分享链接(最省事):加了 --share 后终端会打印 quantenergy.tech/?tab=run&overlay=…,打开即把你的点恢复到交叉曲线上(结果编码在 URL 里)。
  2. 拖文件:在「自己跑」标签底部把 energy.json 拖进上传区(或点击选择);你的点按「模型规模 × ΔE%」落到曲线上,颜色由 basis 决定,架构与当前曲线不符时会加一圈虚线提示。

进入公开的复现画廊,去 /replications/#submit:文件同样只在你浏览器里解析,按钮会带着摘要打开一个 GitHub issue,附件由你自己上传、自己发送。全程不要邮箱;想撤回,在 issue 上说一句即可,不问理由。

7 · 故障排查

8 · 诚实声明 / 注意事项

  1. 测量与估算分得清:只有 measurement_source: "direct-nvml"basis: "measured" 才是真实 NVML 测量;读不到遥测时退回公开数据集并明确标注,绝不把估算伪装成测量。
  2. NVML 测的是 GPU 封装功耗,不是整机墙上功耗——不含 CPU、内存、电源损耗与散热,也不换算 PUE 或 CO₂e(那需要我没有的电网模型)。工况是单流、batch 1、256 token。
  3. 10 次解码迭代 ≠ 10 次独立试验:迭代发生在同一次运行内部,一份报告永远是 n = 1,无论迭代数多高。
  4. 样本量:主数据集 v1.1.0 每个配置 n = 2(CV < 2%);RTX 4090(Ada)深挖是每个配置 n = 1,属补充性案例研究。同一配置隔一次会话重跑,我们实测到的差异可达 8.2 个百分点(1.1B INT8:+146.1% 与 +137.9%)。
  5. 量化内核随版本变化:你的 torch / transformers / bitsandbytes 与发布钉版不同时报告会提示,跨版本比较 ΔE% 必须注明。结论也因此是「这个后端在这张卡上」的结论,不是对 NF4/INT8 格式本身的判决。
  6. 不是认证基准:每份报告都写着 certified_benchmark_result: false。使用 MLCube 规范不代表 MLCommons 背书,也不是官方 MLPerf 结果。
  7. 困惑度是代理指标:只有 Δ 有意义,且不等于下游任务质量(见第 5 节)。
  8. 隐私energy.json 只在你浏览器本地解析,不上传服务器;分享链接把结果编码在 URL 里。

9 · 引用与链接