最近在折腾把 PyTorch 训练好的模型接到 MCP 上,想让 Claude 直接调用本地模型做推理,但卡在几个地方。一是 MCP 的 tool 定义和模型输入输出怎么对齐,比如我这边输入是 tensor,MCP 那边是 JSON,中间要不要写一层 adapter;二是推理延迟,每次调用都重新 load 模型太慢,有没有办法常驻。看了一些文档但例子基本都是查天气、读文件那种,没找到深度学习相关的。想问下有没有人真正把 MCP 和深度学习框架接起来过,踩过哪些坑?
MCP 协议和深度学习框架怎么结合?有实际跑通的案例吗
全部回复
共 11 条我之前也试过类似的路子,把本地跑的 Whisper 和一个小 LLM 通过 MCP 暴露给 Claude 用,确实能跑通,但中间那层 adapter 基本躲不掉。你 tensor 和 JSON 之间其实不用太纠结,直接在 tool 的 inputSchema 里定义成 base64 或者文件路径,让 Claude 传路径进来,服务端再自己 load 成 tensor,比传原始数组靠谱多了,token 也省。
模型常驻这个坑我踩过,最简单的办法就是别把 MCP server 写成一次性脚本,而是跑成一个长期存活的进程,模型在启动时 load 一次放全局,tool 调用只做 forward。用 stdio 模式的话要注意 Claude Desktop 每次重启会杀进程,所以最好挂个独立的 HTTP server,MCP 那层只做转发。
延迟方面,如果你的模型不大,其实可以试试 ONNX Runtime 或者量化版本,比原生 PyTorch 快不少,尤其是 CPU 推理场景。另外 batch 和并发要小心,MCP 调用基本是串行的,多个请求同时来的时候得自己加锁,不然显存容易炸。
我比较好奇你具体是什么模型,如果是视觉类的,输入预处理那块对齐反而比 MCP 本身更麻烦,image 的编码格式和 resize 策略经常和训练时对不上,最后推理结果莫名其妙。
我最近也在搞这个,其实核心就是写个 adapter 层,tensor 转 list 再 json 序列化,反序列化后转回 tensor,不难但挺琐碎。模型常驻的话别用 stdio 那种每次起进程的方式,直接写个常驻的 http server 包成 MCP tool,进程活着模型就一直在显存里。延迟主要还是看模型大小和 batch,小模型基本无感,大模型建议加个队列别并发打爆显存。
模型常驻用 FastAPI 起个服务就行,MCP 那边写个薄 adapter 转 JSON 和 tensor,别每次重载。
这个方向我也踩过一阵子坑,确实能跑通,但没现成轮子。tensor 和 JSON 之间那层 adapter 是省不掉的,我一般是在 tool 的 handler 里做序列化,输入用 base64 或者直接传 list,输出也转成 JSON 能吃的格式,别指望协议层帮你兜。模型常驻这块是关键,千万别在每次 tool call 里 load,我是把模型挂在 server 启动时初始化,handler 只做前向,这样延迟能压到可接受范围。另外注意 MCP server 一般是异步的,PyTorch 推理是阻塞的,最好丢到线程池或者单独进程里跑,不然容易把事件循环卡死。还有个坑是显存,多并发调用的时候要自己加锁或者排队,不然 OOM 分分钟的事。现在网上例子少是因为这玩意儿偏工程,大家跑通了也懒得写,你可以先从本地小模型加一个最简单的 predict tool 试起,跑通链路再优化。
我们组上个月刚把 YOLO 检测接进 MCP,tensor 转 JSON 那层 adapter 是必须写的,不过别用 base64 传大图,直接传临时文件路径会省不少事。模型常驻倒是好解决,server 启动时 load 一次挂全局就行,真正坑的是并发下 PyTorch 的 GIL 会卡住整个 MCP 响应。你们现在延迟大概多少?如果单次超过两秒基本没法用,可能得考虑单独起个推理进程走 socket 通信。
常驻推理服务加一层JSON转tensor的adapter就行,模型别每次重载,起个服务挂后台。
这个方向我也折腾过一阵,确实坑不少,但跑通是没问题的。你说的 tensor 和 JSON 对齐这块,基本都得自己写一层 adapter,我的做法是在 MCP tool 的 schema 里只暴露最朴素的输入,比如 base64 编码的图片或者扁平化的 float 数组,然后服务端再 reshape 成 tensor,输出同理反过来转成 JSON,别想着让协议本身去理解张量结构。模型常驻这块是关键,千万别在 tool 的 handler 里 load 模型,要在 MCP server 启动时就把模型挂到全局或者单例里,handler 只负责预处理和 forward,这样延迟能从几秒降到几十毫秒。我目前是用 FastMCP 起一个 stdio server,里面包了个 CLIP 和一个小的分类模型,Claude Desktop 直接调用没啥问题。另一个容易忽略的坑是超时和并发,推理一慢 MCP 客户端那边就断了,最好把长推理拆成异步任务加轮询,或者干脆限制单次输入规模。还有显存管理,多个 tool 共享一个模型实例时要小心 batch 冲突,我吃过亏。整体感觉这套组合目前还是偏 hack,但做 demo 和内部工具完全够用了。
这个方向我也折腾过一阵,确实踩了不少坑。你提到的 tensor 和 JSON 对齐问题,我的做法是在 MCP tool 那层包一个薄薄的 adapter,输入用 base64 编码 tensor 或者直接传 list,输出也序列化成 JSON,反正 MCP 本身只认文本协议,别指望它理解张量。真正麻烦的是常驻推理,我最后是单独起了一个推理服务进程,MCP server 通过 HTTP 或者 unix socket 去调它,模型只 load 一次,这样延迟能从好几秒降到几百毫秒。至于 MCP tool 定义,建议把模型名、温度、max_tokens 这些做成参数暴露出去,Claude 那边调用起来会自然很多。还有个坑是并发,MCP 一次可能触发多个 tool call,推理服务得做好请求排队,不然显存直接爆。我目前跑通的是一个小型文本分类模型,视觉或者大语言模型还没试,感觉 tokenizer 和输出解析会更头疼。你要是想省事,可以看看 mcp-python-sdk 里有没有人提过类似 issue,或者干脆自己写个轻量 wrapper,别硬套官方例子。
我接过类似的,adapter那层基本跑不掉,建议直接用 pydantic 定义 tool 的 input schema,把 tensor 的 shape 和 dtype 塞进字段描述里,让模型知道该传什么格式。模型常驻的话别在 tool 里 load,起个独立的推理服务,MCP server 只做转发,不然每次冷启动真的顶不住。延迟这块可以用 vLLM 或者 triton 挂后台,MCP 那边就是个 HTTP 客户端。
我上个月刚把 Stable Diffusion 接到 MCP 上跑通了,核心就是在 tool 里做一层 adapter,把 JSON 参数转成 tensor,输出再转回 base64 或文件路径。常驻的问题建议用单例把模型加载放到 server 启动时,别在每次 call_tool 里 load,不然延迟直接爆炸。不过要注意显存占用,Claude 那边超时设置也得调大点,推理类任务几秒很正常。
我也在搞这个,模型常驻用进程池或单独服务就行,MCP那层只做JSON和tensor的转换,别每次重载。