如何通过Serverless框架实现Lambda调用Huggingface DLC完成SageMaker推理部署
问题根因
你遇到的报错本质是AWS Lambda运行环境的文件系统限制:默认仅/tmp目录可写,其余目录均为只读权限。你在Lambda代码运行时执行pip install命令,默认会将依赖写入不可写的用户家目录/home/sbx_user1051,因此触发Errno 30 Read-only file system错误。
解决方案
按优先级从高到低排序:
方案1:预打包依赖,避免运行时安装(推荐)
运行时安装依赖不仅会触发文件权限问题,还会大幅拉长Lambda冷启动时间,容易触发超时限制,最优方案是提前把sagemaker依赖打包到部署包中:
- 可直接使用AWS官方预构建的sagemaker Lambda层,直接在Serverless框架配置中绑定对应层即可,无需自行打包
- 也可在本地打包时将sagemaker库放入依赖目录,和业务代码一起部署到Lambda
- 额外注意:
sagemaker.get_execution_role()接口仅可在SageMaker原生环境(如Studio、笔记本实例)中调用,Lambda环境下需要手动传入SageMaker执行角色ARN,可通过Lambda环境变量注入该值,同时需要为Lambda的执行角色添加SageMaker资源创建的相关权限。
方案2:轻量调用boto3接口实现(最省资源)
Lambda默认已内置boto3库,无需额外安装任何依赖即可直接调用SageMaker OpenAPI完成端点创建,代码示例如下:
import boto3 import os sagemaker_client = boto3.client('sagemaker') # 从环境变量读取提前配置好的SageMaker执行角色ARN role = os.getenv("SAGEMAKER_ROLE_ARN") # HuggingFace对应版本的DLC镜像URI,可根据你的区域、框架版本调整 image_uri = "763104351884.dkr.ecr.us-east-1.amazonaws.com/huggingface-pytorch-inference:1.7.1-transformers4.6.1-gpu-py36-cu110-ubuntu18.04" hub_config = { 'HF_MODEL_ID':'distilbert-base-uncased-distilled-squad', 'HF_TASK':'question-answering' } # 创建SageMaker模型 sagemaker_client.create_model( ModelName="distilbert-qa-model", ExecutionRoleArn=role, PrimaryContainer={ "Image": image_uri, "Environment": hub_config } ) # 后续依次调用create_endpoint_config、create_endpoint接口即可完成端点部署
方案3:修改pip安装路径适配Lambda环境(不推荐)
如果必须要在运行时安装sagemaker库,可修改pip命令参数指定安装路径到可写的/tmp目录,同时将该目录加入Python导入路径,代码修改示例如下:
import sys # 提前将可写目录加入Python导入路径 sys.path.insert(0, '/tmp') def installPack(package): import subprocess # 指定安装路径到/tmp,禁用缓存避免写入只读家目录 subprocess.check_call([sys.executable, "-m", "pip", "install", package, "-t", "/tmp", "--no-cache-dir"]) installPack('sagemaker') from sagemaker.huggingface import HuggingFaceModel
注:该方案存在两个明显缺陷:一是Lambda的/tmp目录最大仅512MB,sagemaker及其依赖体积较大容易占满存储空间;二是运行时安装依赖耗时久,很容易触发Lambda超时限制,仅可用于临时测试。
内容的提问来源于stack exchange,提问作者Pavel Nesterov
相关产品推荐
相关产品推荐

