用途
该技能用于搭建和运行 DeepMind Enformer 的官方远程工具。Enformer 是一个从 DNA 序列直接预测数千条基因组轨迹(CAGE、DNase、ATAC、ChIP 等)的模型,可整合约 100 kb 范围内的调控信号。该提供方提供作者导出的 TF-Hub SavedModel,并按摘要固定版本。
该提供方(端口 8060)与 enformer(端口 8011)互补:8011 是 enformer-pytorch 社区移植版,权重由作者发布版转换而来,运行在 GPU 上,适合追求吞吐量;8060 是官方 TensorFlow SavedModel,运行在 CPU 上,用于复现官方发布的 Enformer 数值。两者可同时驻留,因为官方版不占用显存。
主要能力
- 支持人类和小鼠两个物种的基因组轨迹预测。
- 输入为 DNA 字符串,支持 A、C、G、T、N 字符。
- 返回指定 head 下所有轨迹的中心 bin 值,以及指定轨迹的完整 896-bin 轮廓。
- 序列长度上限 786,432 碱基;超过 393,216 碱基会被中心裁剪,不足则用 N 填充。
- 每次请求最多返回 32 条轨迹的完整轮廓。
- 同一时间仅处理一个请求,第二个请求会在 worker 锁上排队。
使用方式
前置条件
- 在 Linux 上从 ToolUniverse 仓库根目录运行,Python 3.12.3。
- 无需 GPU,也无法使用 GPU(aarch64 TensorFlow wheel 不包含 CUDA 代码)。
- SavedModel 约需 1.0 GiB 磁盘,环境约 600 MB。
- 模型环境使用 Python 3.11。
创建环境
先运行标准库契约检查:
python scripts/remote_validation/setup_skill_preflight.py --implementation enformer_deepmind
导出 provider 资源后加 --check-provider-env;服务启动后加 --live,在不运行模型的情况下验证 MCP 工具集。
创建虚拟环境并安装依赖:
uv venv --seed --managed-python --python 3.11 ~/enformer-dm-venv
~/enformer-dm-venv/bin/pip install --no-deps -r \
src/tooluniverse/remote/enformer_deepmind/environment/requirements.lock
export TOOLUNIVERSE_ENFORMER_DEEPMIND_PYTHON=~/enformer-dm-venv/bin/python
然后安装 kit(即使模式关闭也提供模式机制):
tu remote setup enformer_deepmind --only kit
注意:tensorflow==2.15.1 的 aarch64 wheel 在 PyPI 上不包含实际代码,而是依赖 tensorflow-cpu-aws 同一版本;本提供方固定使用 2.17.1,其 aarch64 wheel 是真实库。
下载并校验权重
tu remote setup enformer_deepmind --only weights
权重会填充到 TFHUB_CACHE_DIR 下的缓存目录。三个权重文件均声明了大小和 sha256,在 worker 启动前校验。worker 在 TFHUB_CACHE_DIR 未设置时会拒绝启动,不会静默联网。
启动服务与调用
export TFHUB_CACHE_DIR=~/enformer-dm-weights
python -m tooluniverse.remote.enformer_deepmind.enformer_deepmind_tool
tu doctor --forward http://127.0.0.1:8060/mcp --json
请求是一个 DNA 字符串。会被中心裁剪或用 N 填充到 393,216 碱基,网络实际读取中央 196,608 碱基,因此计算成本与发送长度无关:8 kb 序列与 393 kb 序列均约需 200 秒。请发送有意义的窗口。
响应包含 centre(所选 head 下所有轨迹的中心 bin 值:人类 5,313 条,小鼠 1,643 条)和 profiles(指定轨迹的完整 896-bin 轮廓)。centre 与 8011 端口返回的键相同,便于逐字段比较。
边界与行为
- 序列长度上限 786,432(输入长度的 2 倍),超出会拒绝并说明上限;超过 393,216 会被中心裁剪。
- 仅接受 A、C、G、T、N,其他字符会按名称拒绝;N 变为全零列。
- 物种仅支持 human 或 mouse,否则拒绝并列出两者。
- 最多 32 条轨迹轮廓,超出会拒绝并说明数量;每个轮廓为 896 个浮点数,以 JSON 传输。
- 并发:一次一个请求,第二个请求排队。
分享与验证
首次使用运行 tu remote login,之后分享命令为:
tu remote share enformer_deepmind --name my-enformer-deepmind-remote --workers 1
检查发现与中继:
tu doctor --forward http://127.0.0.1:8060/mcp --json
tu serve --share --forward http://127.0.0.1:8060/mcp --name validation-enformer-deepmind --workers 1
示例调用
Streamable HTTP 端点为 http://127.0.0.1:8060/mcp。操作 run_enformer_deepmind_predict:
{"sequence":"ACGTACGT","organism":"human","tracks":[0,4100]}
八碱基请求仅用于检查链路,不产生有意义结果(会被 N 填充),且同样约需三分钟。验收使用的真实序列为 src/tooluniverse/remote/enformer_deepmind/smoke/input.txt。
通过本地 MCP 端点调用:
import asyncio
import json
import pathlib
from fastmcp import Client
async def main():
arguments = json.loads('''{"sequence":"ACGTACGT","organism":"human","tracks":[0,4100]}''')
smoke = pathlib.Path(
"src/tooluniverse/remote/enformer_deepmind/smoke/input.txt"
)
if smoke.is_file():
arguments["sequence"] = smoke.read_text().strip()
async with Client("http://127.0.0.1:8060/mcp") as client:
result = await client.call_tool("run_enformer_deepmind_predict", arguments)
print(result)
asyncio.run(main())
预期成功响应包含 implementation、organism、n_bins 896、n_tracks 5313、有界 centre 数组和耗时。
故障排查
- 安装后
import tensorflow失败:可能安装了 2.15.1 等 aarch64 为 shim 的版本;本提供方固定 2.17.1。 - worker 退出码 3 并提及
TFHUB_CACHE_DIR:该变量未设置,请指向--only weights填充的目录。 hub.load尝试联网:缓存键c444fdff3e183daf686869692c26e00391f6773c缺失,重新运行--only weights。- 请求耗时三分钟:这是 CPU-only 的预期行为,第二次调用不会更快;追求吞吐量请使用 8011 端口的
run_enformer_predict。
适用场景
需要复现官方 Enformer 发布数值、在没有 GPU 的环境中运行、或与社区移植版进行逐字段比较时使用。
限制
- 仅 CPU,无 GPU 支持;每次请求约 200 秒,无加速。
- 一次只能处理一个请求。
- 未测量与 8011 端口的跨实现一致性。
- 公开发布、跨用户隔离、并发和恢复均未测试;建议保持私有部署。
- 未经过 Platform 验证;证据仅限本地单机回环端点。
- kit 模式默认关闭:
opt/enformer_deepmind_opt/ops/edm_ops.so为 x86-64 ELF,仓库无 aarch64 构建;在 x86-64 且 CUDA TensorFlow 环境下可设置[kit] mode = "exact"。