在GCP Vertex AI部署FastAPI应用时遇__call__参数缺失错误
在GCP Vertex AI部署FastAPI应用的错误修复
问题现象
部署FastAPI应用至Vertex AI后,日志抛出如下错误:
INFO: Started server process [1] INFO: Waiting for application startup. INFO: ASGI 'lifespan' protocol appears unsupported. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) ERROR: Exception in ASGI application Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/uvicorn/protocols/http/h11_impl.py", line 408, in run_asgi result = await app( # type: ignore[func-returns-value] File "/usr/local/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 84, in __call__ return await self.app(scope, receive, send) File "/usr/local/lib/python3.9/site-packages/uvicorn/middleware/asgi2.py", line 16, in __call__ instance = self.app(scope) TypeError: __call__() missing 1 required positional argument: 'context'
问题原因
Dockerfile的启动命令错误指定了Mangum的handler作为Uvicorn的启动对象。Mangum是为AWS Lambda适配ASGI应用的工具,而Vertex AI容器部署环境直接支持标准ASGI应用,不需要该适配层。Mangum的调用签名与标准ASGI应用不一致,导致Uvicorn启动时参数缺失。
修复步骤
1. 修改Dockerfile启动命令
将原有启动命令:
CMD ["uvicorn", "app.main:handler", "--host", "0.0.0.0", "--port", "8080"]
替换为:
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
2. (可选)清理冗余代码
若无需适配AWS Lambda,可从main.py中移除Mangum相关代码:
# 删除以下两行 from mangum import Mangum handler = Mangum(app)
3. 重新构建部署
执行原构建命令重新生成镜像,再在Vertex AI中重新部署模型:
gcloud builds submit . --tag=<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT>/<YOUR_REPOSITORY>/<PROJECT> --machine-type='n1-highcpu-32' --timeout=900s --verbosity=info
额外说明
Vertex AI容器运行环境原生支持FastAPI这类ASGI应用,直接启动FastAPI的app实例即可正常运行。引入Mangum会破坏ASGI协议的兼容性,导致启动时参数不匹配的错误。
内容的提问来源于stack exchange,提问作者AlbertSawZ
相关产品推荐
相关产品推荐

