使用EAIS推理PyTorch模型(Python)

EAIS实例成功绑定至ECS实例后,您需要远程登录该ECS实例,然后使用EAIS实例进行AI推理。本文为您介绍使用Python脚本通过EAIS推理PyTorch模型的具体操作。

前提条件

  • 已将EAIS实例绑定至ECS实例上。具体操作,请参见绑定实例

  • 已绑定的ECS实例操作系统为Ubuntu、CentOS或Alibaba Cloud Linux。更换ECS实例操作系统的具体操作,请参见更换操作系统(系统盘)

背景信息

EAIS支持您根据自身业务场景选择不同的编程语言,来使用EAIS进行PyTorch模型推理,目前支持两种方式分别为:

  • 使用Python脚本推理PyTorch模型。支持使用PyTorch script模式或者PyTorch eager mode模式进行推理。本文介绍使用该方式进行推理的具体操作。

  • 使用C++程序推理PyTorch模型。具体操作,请参见使用EAIS推理PyTorch模型(C++)

如果您使用EAIS推理过程中遇到性能或者功能问题,请联系EAIS技术支持为您提供定制化的优化方案。

运行环境

本教程重点介绍使用Python脚本推理PyTorch模型的过程,过程中使用EAIS为您提供的两种运行环境部署方式:

  • 使用EAIS提供的EAIS miniconda环境。

    说明

    EAIS miniconda环境是阿里云基于miniconda开发的EAIS使用环境,该环境包含了推理PyTorch模型和使用EAIS推理PyTorch模型所依赖的软件环境,以及用于测试体验的样例文件和模型文件等。部分文件目录的说明如下:

    • eais/data/:存放了用于执行示例程序时需要的数据文件和模型文件。

    • eais/python/:存放了推理样例所需的Python脚本。

  • 在您已有的PyTorch模型运行环境中安装EAIS提供的Python软件包。

推理性能

与GPU实例(NVIDIA T4)相比,使用EAIS推理会明显提升推理的性能。Python脚本使用eais.ei-a6.2xlarge规格的EAIS实例与使用GPU实例(NVIDIA T4)推理的性能对比数据如下表所示

说明
  • 本文数据仅为示例,具体数据以您的实际推理结果为准。

  • 您也可以参考eais-miniconda软件包中提供的Python脚本,自行测试GPU实例(NVIDIA T4)推理的性能来与EAIS实例进行比较。

推理模型

eais.ei-a6.2xlarge

GPU实例(NVIDIA T4)

EAIS比GPU实例(NVIDIA T4)提升的性能倍数

resnet50

2.19 ms

6.24 ms

2.85倍

bert-base

5.37 ms

8.32 ms

1.55倍

操作步骤

  1. 登录并连接实例。

    1. 登录EAIS控制台

    2. 在页面左上角选择实例所在地域。

    3. 在实例列表中,单击EAIS实例对应的ECS实例ID,进入该ECS实例控制台。

    4. 远程登录ECS实例。

      具体操作,请参见连接方式概述

  2. 安装eais-tool软件包,然后查看EAIS实例的相关信息。

    具体操作,请参见eais-tool

  3. 安装CUDA 11.X.X版本软件包。

    1. 执行如下命令,安装CUDA软件包。

      说明

      本操作以安装CUDA 11.7.0版本为例,具体命令以您实际安装的版本为准。

      wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run
      sudo sh cuda_11.7.0_515.43.04_linux.run --silent --toolkit
    2. 执行如下命令,设置CUDA相关的环境变量。

      export PATH=/usr/local/cuda/bin:$PATH
      export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
  4. 安装eais-cuda软件包。

    具体操作,请参见eais-cuda

  5. 搭建运行环境。

    • 方法一:使用EAIS提供的EAIS miniconda环境。

      您只需要安装eais-miniconda软件包即可,具体操作,请参见eais-miniconda

    • 方法二:在您已有的PyTorch模型运行环境中安装EAIS提供的Python软件包。

      重要

      请确保您的运行环境中已安装了Python3以及pip3软件包。

      1. 执行如下命令,安装官方提供的PyTorch版本的软件包,以PyTorch 1.13.1为例。

        pip3 install torch==1.13.1
      2. 安装eais-torch软件包。

        具体操作,请参见eais-torch

  6. 开发模型推理脚本并使用EAIS进行加速推理。

    相较于普通推理流程,您仅需要在进行推理前,在您原有推理脚本的基础上添加一行import eais.torch_eais导入EAIS提供的Python模块,即可使用EAIS推理PyTorch模型。支持使用PyTorch script模式和PyTorch eager mode模式进行推理,Python脚本开发说明和使用示例如下:

    使用PyTorch script模式推理

    • Python脚本开发说明

      假设您的PyTorch模型推理初始源代码如下所示:

      # 导入torch模块
      import torch
      import torchvision
      
      # 加载script模型
      model = torch.jit.load(model_file).cuda()
      # 初始化输入
      tensor input_tensor = torch.randn(...).cuda()
      # 使用gpu进行模型推理
      output_tensors = model(input_tensor)

      如果您需要使用EAIS推理您的PyTorch模型,请将源代码修改为如下内容:

      # 导入torch模块
      import torch
      import torchvision
      # 导入eais提供的python模块
      import eais.torch_eais
      
      # 加载script模型
      model = torch.jit.load(model_file).cuda()
      # 初始化输入
      tensor input_tensor = torch.randn(...).cuda()
      # 使用eais进行模型推理
      output_tensors = model(input_tensor)
    • 使用示例

      1. 准备您的模型推理Python脚本。

        本示例以resnet50模型推理、pytorch_resnet50.py脚本为例,脚本内容如下:

        # 导入torch模块
        import torch
        # 导入eais提供的python模块
        import eais.torch_eais
        # 导入参数解析模块
        import argparse
        
        if __name__ == '__main__':
            parser = argparse.ArgumentParser()
            parser.add_argument('-m', '--model', type=str, required=True, help='model file path')
            FLAGS = parser.parse_args()
            
            # 加载script模型
            model = torch.jit.load(FLAGS.model).cuda()
            # 初始化随机输入tensor
            input_tensor = torch.rand((1, 3, 224, 224)).cuda()
            # 执行模型推理
            output = model(input_tensor).cpu()
            print("output shape:", output.shape)
      2. 执行如下命令,运行您准备好的EAIS模型推理脚本。

        python3 pytorch_resnet50.py -m <resnet50_model_file>

    使用PyTorch eager mode模式推理

    • Python脚本开发说明

      假设您的PyTorch模型推理初始源代码如下所示:

      # 导入torch模块
      import torch
      import torchvision
      
      
      class MyModule(torch.nn.Module):
          def __init__(self):
              super(MyModule, self).__init__()
              ......
      
          def forward(self, x):
              ......
      
      
      # 初始化torch模型
      model = MyModule.cuda()
      # 初始化输入
      tensor input_tensor = torch.randn(...).cuda()
      # 使用gpu进行模型推理
      output_tensors = model(input_tensor)

      如果您需要使用EAIS推理您的PyTorch模型,请将源代码修改为如下内容:

      重要

      源代码中不支持forward函数中包含有python numpy操作和自定义的python function

      # 导入torch模块
      import torch
      import torchvision
      # 导入eais提供的python模块
      import eais.torch_eais
      
      
      class MyModule(torch.nn.Module):
          def __init__(self):
              super(MyModule, self).__init__()
              ......
      
          def forward(self, x):
              ......
      
      
      # 初始化torch模型
      model = MyModule().cuda()
      # 初始化输入
      tensor input_tensor = torch.randn(...).cuda()
      # 使用eais进行模型推理
      output_tensors = model(input_tensor)

    • 使用示例

      1. 准备您的模型推理Python脚本。

        本示例以resnet50模型推理、pytorch_resnet50.py脚本为例,脚本内容如下:

        # 导入torch模块
        import torch
        import torchvision
        # 导入eais提供的python模块
        import eais.torch_eais
        
        if __name__ == '__main__':
            # 初始化resnet50 torch模型
            model = torchvision.models.resnet50(pretrained=True).cuda()
            # 初始化随机输入tensor
            input_tensor = torch.rand((1, 3, 224, 224)).cuda()
            # 执行模型推理
            output = model(input_tensor).cpu()
            print("output shape:", output.shape)
      2. 执行如下命令,运行您准备好的EAIS模型推理脚本。

        python3 pytorch_resnet50.py