从S3部署Llama 2 7B至Amazon SageMaker遇Hub连接错误求助
解决SageMaker部署自定义Llama 2模型时连接Hugging Face Hub的错误
问题原因
你遇到的错误根源在于:
- 环境变量
HF_MODEL_ID被设置为本地路径/opt/ml/model,但SageMaker的HuggingFace推理工具包会将该变量识别为Hugging Face Hub的仓库ID,而仓库ID必须符合repo_name或namespace/repo_name格式,因此触发格式验证错误。 - 尽管指定了自定义的
deploy.py,但工具包默认逻辑优先尝试从Hub加载模型,并未执行你的自定义代码。
解决方案
1. 替换环境变量,指定本地模型路径
将HF_MODEL_ID替换为HF_MODEL_DIR,该变量专门用于指向容器内的本地模型目录,工具包会直接从该路径加载模型,而非连接Hugging Face Hub。
修改后的环境配置:
import json config = { 'HF_MODEL_DIR': "/opt/ml/model", # 指定本地模型存储路径 'SM_NUM_GPUS': json.dumps(number_of_gpu), 'MAX_INPUT_LENGTH': json.dumps(1024), 'MAX_TOTAL_TOKENS': json.dumps(2048), }
2. 确保自定义deploy.py实现标准推理函数
你的deploy.py需要实现SageMaker推理工具包要求的核心函数,这样工具包才会调用你的自定义逻辑。示例代码如下:
from transformers import AutoModelForCausalLM, AutoTokenizer import torch def model_fn(model_dir): # 加载本地模型与tokenizer tokenizer = AutoTokenizer.from_pretrained(model_dir) # 适配Llama 2的加载参数 model = AutoModelForCausalLM.from_pretrained( model_dir, torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True ) return model, tokenizer def predict_fn(input_data, model_and_tokenizer): model, tokenizer = model_and_tokenizer # 处理输入文本并转移到GPU inputs = tokenizer(input_data["text"], return_tensors="pt").to("cuda") # 生成推理结果 outputs = model.generate( **inputs, max_new_tokens=200, temperature=0.7, do_sample=True ) return tokenizer.decode(outputs[0], skip_special_tokens=True)
3. 更换为GPU兼容的容器镜像
你当前使用的是CPU版本镜像,但部署实例为GPU类型(ml.g4dn.2xlarge),需更换为对应版本的GPU镜像,避免资源不匹配:
image='763104351884.dkr.ecr.us-west-2.amazonaws.com/huggingface-pytorch-inference:2.0.0-transformers4.28.1-gpu-py310-cu117-ubuntu20.04'
4. 完整修改后的部署代码
from sagemaker.huggingface import HuggingFaceModel import json model_s3_path = 's3://bucket/model/model.tar.gz' # SageMaker配置 instance_type = "ml.g4dn.2xlarge" number_of_gpu = 1 health_check_timeout = 300 # 使用GPU兼容镜像 image='763104351884.dkr.ecr.us-west-2.amazonaws.com/huggingface-pytorch-inference:2.0.0-transformers4.28.1-gpu-py310-cu117-ubuntu20.04' # 修正后的环境变量配置 config = { 'HF_MODEL_DIR': "/opt/ml/model", 'SM_NUM_GPUS': json.dumps(number_of_gpu), 'MAX_INPUT_LENGTH': json.dumps(1024), 'MAX_TOTAL_TOKENS': json.dumps(2048), } # 创建HuggingFaceModel实例 llm_model = HuggingFaceModel( image_uri=image, role=sagemaker.get_execution_role(), model_data=model_s3_path, entry_point="deploy.py", source_dir="src", env=config, ) # 部署模型 llm = llm_model.deploy( initial_instance_count=1, instance_type=instance_type, container_startup_health_check_timeout=health_check_timeout, )
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

