EAIS实例成功绑定至ECS实例后,您需要远程登录该ECS实例,然后使用EAIS实例进行AI推理。本文为您介绍使用Python或C++脚本通过EAIS推理PyTorch模型的具体操作。
前提条件
已将EAIS实例绑定至ECS实例上。具体操作,请参见绑定实例。
已将您需要推理的PyTorch模型文件以及用于存放推理所需输入数据的文件放至ECS实例客户端的目录下。
背景信息
EAIS为您提供了基于EAIS miniconda环境进行PyTorch模型推理的环境,该环境提供了两种推理PyTorch模型的方式。您可以根据自身业务场景进行选择,两种方式分别为:
- 使用Python脚本推理PyTorch模型
- 使用C++程序推理PyTorch模型
bin/:存放了EAIS服务程序。
eais/data/:存放了用于执行示例程序时需要的数据文件和模型文件。
eais/python/:存放了推理样例所需的Python脚本。
eais/cpp/lib/:存放了执行EAIS服务程序和C++示例程序依赖的库文件,也是开发您自己的应用程序需要依赖的C++库文件。
eais/cpp/src/:存放了推理样例所需的C++源代码文件。
操作步骤
登录并连接实例。
下载EAIS miniconda环境并激活。
执行如下命令,下载eais-miniconda软件包。
wget https://aiacc-inference-public.oss-cn-beijing.aliyuncs.com/eais/packages/eais-miniconda.zip
执行如下命令,解压eais-miniconda软件包。
apt-get update && apt-get install -y zip unzip eais-miniconda.zip
执行如下命令,进入eais-miniconda软件包根目录。
cd eais-miniconda/
说明后续操作均会以此为根目录。
执行如下命令,激活EAIS miniconda环境。
source bin/activate
执行如下命令,启动EAIS服务进程并开启EAIS提供的加速功能。
bin/entrypoint.py start \ --eais-environ=ENABLE_AIACC_TORCH=true,AIACC_TORCH_MODE=normal
说明在EAIS实例与ECS实例解除绑定后,请执行
bin/entrypoint.py stop
手动关闭服务进程,否则会影响后续EAIS实例的绑定与使用。开发模型推理脚本并使用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)
使用示例
准备您的模型推理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)
执行如下命令,运行您准备好的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
使用示例
准备您的模型推理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; }
编译您用于模型推理的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软件包的根目录。运行您编译生成的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>