概述
函数计算上线huggingface应用模版,需求如下:
- 用户只需要制定huggingface model_id、model_task等信息就能将模型一键拉起
- 对外提供server服务,并以api形式输出,不提供UI页面
基于上述诉求,能让用户在函数计算一键拉起huggingface模型,便于用户基于函数计算使用模型,同时提供AI runtime的原子能力,让更多用户享受到大模型发展带来的红利
部署
创建应用进入到详情页
huggingface配置
其中主要涉及huggingface中的模型ID, 模型任务类型, 加载模型需要的库,已经huggingface access token, 下面以distilbert/distilbert-base-uncased-finetuned-sst-2-english为例,进入到模型详情页,https://huggingface.co/distilbert/distilbert-base-uncased-finetuned-sst-2-english
模型ID, 其中上图中标识1,即为模型ID
- 模型任务类型, 其中上图中标识的2, 即为任务类型。模版中的认为类型需要映射下,具体映射规则见https://yuque.alibaba-inc.com/lnpq52/nnhpqb/bzgnvdkc204zbrh8#NeZfm,以图中Text Classification->text-classification
- 加载模型需要的库, 图中3位置即为需要加载的模型库,选择模版中的Transformers即可
- access token, 进入到https://huggingface.co/settings/tokens,页面获取即可
GPU配置
GPU相关配置按需调整即可
创建完成
创建完成直接通过域名调用即可,域名见下图位置
方案
分析huggingface中的模型,本身为了用户使用方便,huggingface提供了便捷性能优越的pipeline库便于用于直接基于pipeline使用模型,减小用户使用和学习成本。本方案就是基于huggingface封装的pipeline进行封装设计。而huggingface涉及到的pipeline主要分两类:
- transformers
- diffusers
在huggingface模型详情页有具体的模型划分,非常方便用户进行区分
概览
整个方案最终只需要用户指定huggingface的模型ID+模型task即可,依赖的云产品:
- 函数计算, 用于提供算力
- NAS
整个应用包括三个资源:
- model_download, 初始化应用时进行模型下载
- model_app, 部署模型提供api接口服务
- NAS
- 用于持久化模型(可选,不选择挂载的话模型每次服务启动都需要重新进行拉取)
- 用于安装基础镜像中不支持的python库
详情
huggingface应用使用的huggingface提供的transformers和diffusers两个库进行模型加载,所以本身模型需要能支持这两个库进行加载才行。
transformers
如何确定模型能被transformers加载,可以进入到模型详情页,这里以distilbert/distilbert-base-uncased-finetuned-sst-2-english为例,如下图所示
如上如所示,圈出位置有Transformers代表能用transformers进行加载,就可以使用函数计算提供的huggingface应用模版
支持TASK列表
HuggingFace页面展示的TASK |
部署函数计算huggingface时需要填写的model_task |
Audio Classification |
audio-classification |
Automatic Speech Recognition |
automatic-speech-recognition |
Text-to-Audio |
text-to-audio |
Text-to-Speech |
text-to-speech |
Depth Estimation |
depth-estimation |
Image Classification |
image-classification |
Image Segmentation |
image-segmentation |
Image-to-Image |
image-to-image |
Object Detection |
object-detection |
Video Classification |
video-classification |
Zero-Shot Image Classification |
zero-shot-image-classification |
Zero-Shot Object Detection |
zero-shot-object-detection |
Fill-Mask |
fill-mask |
Question Answering |
question-answering |
Summarization |
summarization |
Table Question Answering |
table-question-answering |
Text Classification |
text-classification |
Text Generation |
text-generation |
Text2Text Generation |
text2text-generation |
Token Classification |
token-classification |
Translation |
translation |
Zero-Shot Classification |
zero-shot-classification |
Document Question Answering |
document-question-answering |
Feature Extraction |
feature-extraction |
Image Feature Extraction |
image-feature-extraction |
Image-to-Text |
image-to-text |
Mask Generation |
mask-generation |
Visual Question Answering |
visual-question-answering |
示例
下面是一个用户层面创建步骤
- 进入到huggingface模型详情页,查看对应的模型ID/模型TASK/pipeline类型
以openai/whisper-large-v3为例,获取如下三个信息,如下三个信息在详情页不全的模型不支持部署
- 1、model_id
- 2、model_task
- 3、pipeline类型(Transformers/Diffusers)
- 在应用模版中填上如上三个信息, 其中模型任务见上文Task列表,进行创建应用即可,就会拉起一个加载该模型的server,对外提供API服务
- api服务的入参可以简单使用{"data":{"input":"xxxxxx"}}
diffusers
如何确定哪些模型能使用diffusers进行加载,以runwayml/stable-diffusion-v1-5为例,查看模型详情页
如上图圈出有Diffusers标识的才可以使用
支持TASK列表
参考:https://huggingface.co/docs/diffusers/using-diffusers/pipeline_overview
HuggingFace页面展示的TASK |
部署函数计算huggingface时需要填写的model_task |
参考文档 |
Text-to-Image |
text-to-image |
https://huggingface.co/docs/diffusers/using-diffusers/conditional_image_generation |
Image-to-Image |
image-to-image |
https://huggingface.co/docs/diffusers/using-diffusers/img2img |
Inpainting |
inpainting |
https://huggingface.co/docs/diffusers/using-diffusers/inpaint |
Depth-to-image |
depth-to-image |
https://huggingface.co/docs/diffusers/using-diffusers/depth2img |
示例
下面是一个用户层面创建步骤
- 进入到huggingface模型详情页,查看对应的模型ID/模型TASK/pipeline类型
以runwayml/stable-diffusion-v1-5为例,获取如下三个信息,如下三个信息在详情页不全的模型不支持部署
- 1、model_id
- 2、model_task
- 3、pipeline类型(Transformers/Diffusers)
- 在应用模版中填上如上三个信息, 其中模型任务见上文Task列表,进行创建应用即可,就会拉起一个加载该模型的server,对外提供API服务
API
由于不同的模型入参出参都是不同,具体API参数需要参考,由于huggingface模型加载主要使用两个库Transformers和Diffusers两个,所以API也进行区分
推理请求
POST /
具体body参数如下
Transformers
- api服务的入参可以简单使用{"data":{"input":"xxxxxx"}}
- 当然也支持传递更具体的参数,确定模型服务对外提供API参数,以transformers的pipeline为例,进入到https://huggingface.co/docs/transformers/main_classes/pipelines,根据模型对应的model_task找到对应pipelines,以text-classification(Text Classification)为例,在截图位置找到对应的pipeline, TextClassificationPipeline
入参
进入到具体pipeline(TextClassificationPipeline)的详情,查看对应的__call__方法,函数参数就是对应的API的入
出参
__call__返回值即为出参数据,如pipeline(TextClassificationPipeline)出参
示例
// 请求:POST / // 简单调用 { "data": { "input": "你好" } } // 或者基于__call__参数 { "data": { "inputs": "你好", "top_k": 1, "fucntion_to_apply": "default" } } // 结果 { "data": [ { "label": "NEGATIVE", "score": 0.7005688548088074 } ] }
Diffusers
如何确定API入参,以runwayml/stable-diffusion-v1-5为例,
- 进入模型详情页,找到下图中具体的pipeline信息(以Pipeline为后缀)
- 上图信息是StableDiffusionPipeline,进入https://huggingface.co/docs/diffusers/v0.26.3/en/index?search=true进行搜索
入参
pipeline详情中的__call__函数的入参就是API参数, https://huggingface.co/docs/diffusers/v0.27.2/en/api/pipelines/stable_diffusion/text2img#diffusers.StableDiffusionPipeline.__call__
示例
POST / { "data":{ "prompt": "a dog", "width": 512, "height": 512 } }
安装模型依赖
- 在应用页面,找到模型推理函数,点击函数进入函数详情页
- 执行一次推理,登录实例,以安装requests为例, 执行pip install requests --target=/mnt/${functionName}/python , 这里functionName=huggingface-s7xy-model-app也即推理函数名
示例
注意📢
- 并不是所有的huggingface都支持pipeline部署,本次方案优先支持pipeline进行部署的模型,其他模型后续看方案进行支持
- api的输出,默认np.ndarray->list, Image->base64