基于函数计算低成本部署Google Gemma模型服务

Google20240221日正式推出了首个开源模型族Gemma,并同时上架了2b7b两个版本。您可以使用函数计算的GPU实例以及函数计算的闲置模式低成本快速部署Gemma模型服务。

前提条件

操作步骤

部署Gemma模型服务的过程中将产生部分费用,包括GPU资源使用、vCPU资源使用、内存资源使用、磁盘资源使用和公网出流量以及函数调用的费用。具体信息,请参见计费概述

创建应用

  1. 请根据下列步骤,获取ACR仓库的域名和仓库地址。

    1. 登录容器镜像服务控制台,选择函数所在的地域,点击目标企业版实例卡片中的管理

    2. 在左侧导航栏点击访问控制,然后选择公网页签。如果访问入口的开关处于关闭状态,请打开开关。如果您希望任何公网机器均可登录您的仓库,请删除所有公网白名单。否则,请根据您的情况设定公网白名单。完成后,请保存该ACR实例的域名地址

      image

    3. 在左侧导航栏点击镜像仓库,然后点击目标仓库的仓库名称,进入仓库详情页面。

    4. 请保存该仓库的公网地址

      image

  2. 下载Gemma模型权重。您可以选择从Hugging FaceModelScope平台下载,本文以从ModelScope下载Gemma-2b-it模型为例,详情请参见Gemma-2b-it

    重要

    如果您使用Git下载模型,请先安装Git扩展LFS后,执行git lfs install初始化Git LFS,然后再执行git clone进行下载。否则,由于模型过大,可能导致下载的模型不完整,无法正常使用Gemma服务。

  3. 创建Dockerfile文档和模型服务代码文件app.py

    • Dockerfile

      FROM registry.cn-shanghai.aliyuncs.com/modelscope-repo/modelscope:fc-deploy-common-v17
      
      WORKDIR /usr/src/app
      
      COPY . .
      
      RUN pip install -U transformers
      RUN pip install -U accelerate
      
      CMD [ "python3", "-u", "/usr/src/app/app.py" ]
      
      EXPOSE 9000
    • app.py

      from flask import Flask, request
      from transformers import AutoTokenizer, AutoModelForCausalLM
      
      model_dir = '/usr/src/app/gemma-2b-it'
      
      app = Flask(__name__)
      
      tokenizer = AutoTokenizer.from_pretrained(model_dir)
      model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto")
      
      @app.route('/invoke', methods=['POST'])
      def invoke():
          request_id = request.headers.get("x-fc-request-id", "")
          print("FC Invoke Start RequestId: " + request_id)
      
          text = request.get_data().decode("utf-8")
          print(text)
          input_ids = tokenizer(text, return_tensors="pt").to("cuda")
          outputs = model.generate(**input_ids, max_new_tokens=1000)
          response = tokenizer.decode(outputs[0])
          print("FC Invoke End RequestId: " + request_id)
          return str(response) + "\n"
      
      if __name__ == '__main__':
          app.run(debug=False, host='0.0.0.0', port=9000)

      关于函数计算支持的所有HTTP Header,请参见函数计算公共请求头

    完成后代码目录结构如下所示。

    .
    |-- app.py
    |-- Dockerfile
    `-- gemma-2b-it
        |-- config.json
        |-- generation_config.json
        |-- model-00001-of-00002.safetensors
        |-- model-00002-of-00002.safetensors
        |-- model.safetensors.index.json
        |-- README.md
        |-- special_tokens_map.json
        |-- tokenizer_config.json
        |-- tokenizer.json
        `-- tokenizer.model
    
    1 directory, 12 files
    
  4. 依次执行以下命令构建并推送镜像。其中{REPO_ENDPOINT}是步骤1中目标镜像仓库的公网地址,{REGISTRY}ACR实例的域名地址。

    IMAGE_NAME={REPO_ENDPOINT}:gemma-2b-it
    docker login --username=mu****@test.aliyunid.com  {REGISTRY}
    docker build -f Dockerfile -t $IMAGE_NAME . && docker push $IMAGE_NAME

    以上命令中的{NAMESPACE}和{REPO}需替换为您已创建的命名空间名称和镜像仓库名称。

  5. 创建函数。

    1. 登录函数计算控制台,在左侧导航栏,选择函数管理 > 函数列表

    2. 在顶部菜单栏,选择地域,然后在函数列表页面,单击创建函数

    3. 在创建函数页面,选择GPU函数类型,设置以下配置项,然后单击创建

      重点配置项说明如下,其余配置项选择默认值即可。

      配置项

      说明

      GPU 卡型

      选择Tesla 系列

      规格方案

      • GPU显存规格设置为16 GB。

      • vCPU 规格设置为2核。

      • 内存规格设置为16 GB。

      镜像配置

      容器镜像

      单击下方的选择 ACR 中的镜像,然后在选择容器镜像面板,选择步骤3推送到您的ACR镜像仓库中的镜像。

      监听端口

      设置为9000。

  6. 待上一步创建的函数的状态变更为函数已激活时,您可以配置最小实例数>0,解决冷启动问题。

    1. 在函数详情页面选择弹性配置页签,在下方弹性策略区域,单击目标策略行的配置

    2. 配置弹性策略面板,设置最小实例数为≥1的值,然后单击确定

使用Google Gemma服务

  1. 在函数详情页面,选择触发器页签,在目标HTTP触发器的配置信息列获取触发器的URL。

  2. 执行以下命令调用函数。

    curl -X POST -d "who are you" https://func-i****-****.cn-shanghai.fcapp.run/invoke

    预期输出如下。

    <bos>who are you?
    
    I am a large language model, trained by Google. I am a conversational AI that can understand and generate human language, and I am able to communicate and provide information in a comprehensive and informative way.
    
    What can I do for you today?<eos>
  3. 在函数详情页面,选择监控 > 实例指标页签,查看指标情况。

    您可以看到在没有函数调用发生时,该实例的显存使用量会降至零。而当有新的函数调用请求到来时,函数计算平台会迅速恢复并分配所需的显存资源。从而达到降本效果。

    说明

    查看指标的实例,需要先启用日志功能,具体请参见配置日志功能

删除资源

如您暂时不需要使用此函数,请及时删除对应资源。如果您需要长期使用此应用,请忽略此步骤。

  1. 登录函数计算控制台,在左侧导航栏,选择函数管理 > 函数列表

  2. 在函数列表,找到目标函数,单击其右侧操作列的删除,在弹出的对话框中,确认同时要删除的资源无误后再次确认删除函数。

相关文档

关于Google发布的开源模型族Gemma的更多详情,请参见gemma-open-models