SuperAPI AI 工具集

setup-enformer_deepmind-remote-tool

智能体与模型

查看项目

更新于 10-20 04:54

技能介绍

用途

该技能用于搭建和运行 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"。