阿里云首页 弹性加速计算实例EAIS 相关技术圈

使用EAIS实例加速(PyTorch模型)

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

前提条件

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

  • 已将您需要推理的PyTorch模型文件以及用于存放推理所需输入数据的文件放至ECS实例客户端的目录下。

背景信息

EAIS为您提供了基于EAIS miniconda环境进行PyTorch模型推理的环境,该环境提供了两种推理PyTorch模型的方式。您可以根据自身业务场景进行选择,两种方式分别为:

  • 使用Python脚本推理PyTorch模型
  • 使用C++程序推理PyTorch模型
EAIS miniconda环境是阿里云基于miniconda开发的EAIS使用环境,该环境包含了运行EAIS服务和推理PyTorch模型所依赖的安装包,以及用于测试体验的样例文件和模型文件等。部分文件目录的说明如下:
  • bin/:存放了EAIS服务程序。

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

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

  • eais/cpp/lib/:存放了执行EAIS服务程序和C++示例程序依赖的库文件,也是开发您自己的应用程序需要依赖的C++库文件。

  • eais/cpp/src/:存放了推理样例所需的C++源代码文件。

操作步骤

  1. 登录并连接实例。

    1. 登录EAIS控制台

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

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

    4. 远程登录ECS实例。具体操作,请参见远程连接ECS实例

  2. 下载EAIS miniconda环境并激活。

    1. 执行如下命令,下载eais-miniconda软件包。

      wget https://aiacc-inference-public.oss-cn-beijing.aliyuncs.com/eais/packages/eais-miniconda.zip
    2. 执行如下命令,解压eais-miniconda软件包。

      apt-get update && apt-get install -y zip
      unzip eais-miniconda.zip
    3. 执行如下命令,进入eais-miniconda软件包根目录。

      cd eais-miniconda/
      说明

      后续操作均会以此为根目录。

    4. 执行如下命令,激活EAIS miniconda环境。

      source bin/activate
  3. 执行如下命令,启动EAIS服务进程并开启EAIS提供的加速功能。

    bin/entrypoint.py start \
      --eais-environ=ENABLE_AIACC_TORCH=true,AIACC_TORCH_MODE=normal
    说明

    在EAIS实例与ECS实例解除绑定后,请执行bin/entrypoint.py stop手动关闭服务进程,否则会影响后续EAIS实例的绑定与使用。

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

    >>>使用Python脚本推理PyTorch模型

    • Python脚本开发说明

      相较于普通推理流程,您仅需要在进行推理前,在您原有推理脚本的基础上添加一行import eais.torch_eais导入EAIS提供的Python模块,即可使用EAIS推理PyTorch模型。

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

      # 导入torch模块
      import torch
      import torchvision
      import torch_sparse
      import torch_scatter
      import torch_cluster
      import torch_spline_conv
      
      # 加载jit模型
      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
      import torch_sparse
      import torch_scatter
      import torch_cluster
      import torch_spline_conv
      # 导入eais提供的python模块
      import eais.torch_eais
      
      # 加载jit模型
      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()
            
            # 加载jit模型
            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模型推理脚本。

        python pytorch_resnet50.py -m <resnet50_model_file>

    >>>使用C++程序推理PyTorch模型

    • C++程序开发说明

      相较于普通推理流程,您无需修改原有C++代码文件,仅需要在编译您的C++代码文件时链接EAIS提供的so库文件,或者在运行您已有的C++推理程序前,将LD_PRELOAD环境变量值设置为EAIS提供的so库文件名,即可使用EAIS推理PyTorch模型。

      EAIS提供的so库文件位于eais-miniconda软件包的eais/cpp/lib目录下,您需要用到的so库文件为libtorcheais.so-libtorch1.x.x。两种方法的说明如下:

      • 方法一:通过编译您已有的C++代码文件时链接EAIS提供的so库文件,来使用EAIS推理PyTorch模型。

        假设您使用CMake编译您的C++代码文件,且您的初始CMake编译文件内容如下:

        ...
        link_libraries(
            torch_cpu
            torchvision
            torchsparse
            torchsplineconv
            torchcluster
            torchscatter
        )
        ...

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

        ...
        link_libraries(
            # 必须在链接torch的so之前链接EAIS提供的torcheais库
            torcheais
            torch_cpu
            torchvision
            torchsparse
            torchsplineconv
            torchcluster
            torchscatter
        )
        ...
      • 方法二:通过设置LD_PRELOAD环境变量为EAIS提供的so库文件,来使用EAIS推理PyTorch模型。

        假设您用于推理PyTorch模型的C++程序名称为my_program,且您运行您的C++程序的命令为如下所示:

        ./my_program

        如果您需要使用EAIS推理您的PyTorch模型,以libtorch 1.9.0版本为例,您可以参考如下命令重新运行您的C++程序:

        说明

        运行前请确保已将EAIS提供的libtorcheais.so-libtorch1.9.0文件拷贝到了您C++程序所在的目录。

        LD_PRELOAD=./libtorcheais.so-libtorch1.9.0 ./my_program
    • 使用示例

      1. 准备您的模型推理C++代码文件。

        本文以resnet50模型推理、C++代码文件pytorch_resnet50.cpp为例,文件内容如下:

        #include <torch/script.h>
        #include <iostream>
        
        int main(int argc, char **argv) 
        {
            auto model = torch::jit::load(argv[1]).cuda();
            auto input_tensor = torch::rand({1, 3, 224, 224}).cuda();
            auto output = model.forward({input_tensor}).toTensor().cpu();
            std::cout << "output shape: " << output.sizes() << std::endl;
            
            return 0;
        }
      2. 编译您用于模型推理的C++代码文件。

        以命令行g++编译的方式为例,代码如下:

        g++ ./pytorch_resnet50.cpp \
          -O pytorch_resnet50 \
          -I LIBTORCH_DIR/include \
          -L LIBTORCH_DIR/lib \
          -l torch \
          -l torch_cpu \
          -l c10

        其中,LIBTORCH_DIR为您所使用的libtorch软件包的根目录。

      3. 运行您编译生成的C++程序。

        以libtorch 1.9.0版本为例,您可以参考如下命令运行您的C++程序:

        说明

        运行前请确保已将EAIS提供的libtorcheais.so-libtorch1.9.0文件拷贝到了您C++程序所在的目录。

        LD_PRELOAD=./libtorcheais.so-libtorch1.9.0 \
          ./pytorch_resnet50 <resnet50_model_file>
首页 弹性加速计算实例EAIS 用户指南 使用EAIS实例加速(PyTorch模型)