最近在折腾把本地训练好的模型封装成MCP服务器给LLM调用,但遇到个选择困难。我的推理代码是PyTorch写的,但看MCP官方文档里示例大多是TensorFlow Serving或者ONNX Runtime。直接上PyTorch的TorchServe吧,感觉和MCP的tool/schema对接有点绕,还得自己写不少胶水代码。另外模型是动态图,导出成TorchScript总报版本兼容问题。想问下大家实际生产环境里,MCP这边的深度学习推理一般用什么方案?是硬上ONNX统一格式,还是干脆容器里直接跑Python脚本走HTTP?另外有没有现成的MCP-server包装PyTorch模型的库,能省掉自己撸协议转换的?求指条明路,孩子快被各种runtime搞疯了。
MCP服务器用PyTorch还是TF后端?搞深度学习的MCP接入有点懵
全部回复
共 6 条说实话我最近也在搞这个,最后选了ONNX Runtime,主要是TorchServe那套配置确实重,而且MCP这边tool schema定义得自己手搓,太费劲了。不过动态图转ONNX也有坑,尤其是控制流多的模型,建议你先拿几个典型输入trace一下试试。另外别指望现成库,目前社区里没看到特别成熟的PyTorch+MCP封装,基本都是自己写个FastAPI中转层,把MCP的tool调用映射到模型推理函数上,反而更灵活可控。
说实话PyTorch和MCP对接这块我踩坑踩得挺狠的,最后干脆放弃了TorchServe,直接在容器里跑个FastAPI把推理逻辑包成HTTP接口,然后用现成的MCP-SSE适配器挂上去,反而省心。动态图导出TorchScript这事我建议你别死磕,除非你的部署环境对延迟要求特别苛刻,不然纯Python推理加个缓存机制完全够用。ONNX统一格式听起来很美,但遇到自定义算子或者动态shape的时候能折腾到怀疑人生,特别是现在PyTorch 2.x的export模式跟老版本兼容性又不一样。我倒是见过几个开源项目比如mcp-torch或llama-mcp在做封装,但都还不够成熟,生产环境还是自己写胶水代码最可控。你试试把模型推理拆成独立服务,MCP这边只做tool定义和参数映射,这样两边耦合度低,后面换框架也不至于重写。
说实话我最近也被这个坑过,PyTorch动态图转TorchScript那个版本兼容问题真的能让人心态崩掉。我的做法是直接放弃TorchServe,在容器里跑一个简单的FastAPI包装PyTorch模型,然后让MCP那边用HTTP tool去调,虽然多写点胶水代码但至少逻辑清晰,而且调试的时候能直接curl测试,比套一层TorchServe的schema省心太多。ONNX统一格式我也试过,但如果你模型里有自定义算子或者依赖某些第三方库,导出过程一样会卡,而且ONNX Runtime和PyTorch的数值精度有时候会有细微差别,尤其在NLP任务上,跑出来的结果和本地验证对不上,排查起来很痛苦。至于现成的MCP-PyTorch库,我目前看到的要么是demo级别的玩具,要么就是绑定特定框架,真正能直接拿来用的成熟方案还没遇到,所以自己写个轻量封装反而更可控。如果你非要走ONNX,建议先在开发环境里把导出和推理的pipeline用脚本固化下来,别指望一次性成功,迭代个几轮就顺了。另外你提到动态图,其实可以试试PyTorch的torch.compile或者直接保持eager模式,只要输入输出是固定shape,用HTTP轮询的方式完全够用,别为了追求性能去牺牲开发效率。
直接上ONNX吧,动态图那点灵活性在服务化面前真不值当折腾TorchScript。
我前段时间也踩过这个坑,最后选的是容器里直接跑Python脚本走HTTP,没硬上ONNX。原因是我的模型里有自定义算子,导出ONNX时各种不支持,折腾两天不如直接FastAPI包一层省事。MCP那边其实不关心你后端是什么,它只要一个能被调用的tool接口,schema对得上就行,所以你完全可以把PyTorch推理服务单独跑,MCP server只做转发和参数校验。TorchServe我也试过,它的management API和推理API混在一起,跟MCP的tool定义映射起来确实别扭,而且版本升级经常出幺蛾子。至于现成的包装库,我目前没找到特别成熟的,社区里有人用mcp-python-sdk自己写了个wrapper,但基本还是胶水活。如果延迟要求不是特别苛刻,HTTP方案真的够用,还方便你加日志和限流。硬要统一格式的话,ONNX Runtime确实稳,但前提是你的模型能干净导出,动态图这块就是最大的坑。
直接容器里跑FastAPI包PyTorch最省事,MCP那边只管调HTTP,别折腾ONNX了。