这是来自高通人工智能的A.K Roy的客座文章。
Amazon Elastic Compute Cloud(Amazon EC2) DL2q实例由高通AI 100标准加速器提供支持,可用于以高效低成本的方式在云中部署深度学习(DL)工作负载。它们还可用于开发和验证将在高通设备上部署的DL工作负载的性能和准确性。DL2q实例是首个将高通人工智能(AI)技术引入云端的实例。
每个DL2q实例拥有八个高通AI 100标准加速器和128 GiB的加速器内存,客户还可以使用DL2q实例运行流行的生成AI应用程序,如内容生成、文本摘要和虚拟助手,以及自然语言处理和计算机视觉的经典AI应用程序。此外,高通AI 100加速器采用了智能手机、自动驾驶、个人电脑和扩展现实头戴设备上使用的相同AI技术,因此在部署之前可以使用DL2q实例开发和验证这些AI工作负载。
新的DL2q实例亮点
每个DL2q实例包含八个高通云AI100加速器,集成的Int8推断性能超过2.8 PetaOps,FP16推断性能超过1.4 PetaFlops。实例具有112个AI核心,128 GB的加速器内存容量和每秒1.1 TB的内存带宽。
每个DL2q实例拥有96个虚拟CPU,系统内存容量为768 GB,支持100 Gbps的网络带宽,以及19 Gbps的Amazon Elastic Block Store(Amazon EBS)存储。
实例名称 | 虚拟CPU | 云AI100加速器 | 加速器内存 | 加速器内存带宽(汇总) | 实例内存 | 实例网络 | 存储(Amazon EBS)带宽 |
DL2q.24xlarge | 96 | 8 | 128 GB | 1.088 TB/s | 768 GB | 100 Gbps | 19 Gbps |
高通云AI100加速器创新
云AI100加速器系统芯片(SoC)是一种专为满足从数据中心到边缘的广泛深度学习应用需求而构建的可扩展多核架构。该芯片采用标量、矢量和张量计算核心,具有126 MB的产业领先的片上静态随机存储器(SRAM)容量。这些核心通过高带宽低延迟的片上网络互连(NoC)网格相互连接。
AI100加速器支持广泛全面的模型和用例。下表突出显示了模型支持的范围。
模型类别 | 模型数量 | 示例 |
自然语言处理 | 157 | BERT、BART、FasterTransformer、T5、Z-code MOE |
生成AI – 自然语言处理 | 40 | LLaMA、CodeGen、GPT、OPT、BLOOM、Jais、Luminous、StarCoder、XGen |
生成AI – 图像 | 3 | Stable diffusion v1.5和v2.1、OpenAI CLIP |
计算机视觉 – 图像分类 | 45 | ViT、ResNet、ResNext、MobileNet、EfficientNet |
计算机视觉 – 物体检测 | 23 | YOLO v2、v3、v4、v5和v7,SSD-ResNet、RetinaNet |
计算机视觉 – 其他 | 15 | LPRNet、超分辨率/SRGAN、ByteTrack |
汽车网络* | 53 | 感知和激光雷达、行人、车道和红绿灯检测 |
总计 | >300 | |
* 大多数汽车网络都是由多个网络的融合组成。
DL2q加速器上的大型片上SRAM可以高效地实现高级性能技术,例如用于存储权重的MX6微指数精度和加速器之间通信的MX9微指数精度。微指数技术在以下开放计算项目(OCP)行业公告中有所描述:AMD、Arm、英特尔、Meta、Microsoft、NVIDIA和高通将下一代窄精度数据格式标准化为人工智能»开放计算项目。
实例用户可以使用以下策略来最大化性能与成本的比值:
- 使用MX6微指数精度将权重存储在加速器DDR内存中。使用MX6精度可以充分利用可用内存容量和内存带宽,以提供一流的吞吐量和延迟。
- 使用FP16进行计算以提供所需的用例准确性,同时利用芯片上优越的SRAM和卡上的备用TOP来实现高性能低延迟的MX6到FP16内核。
- 使用优化的批处理策略和更高的批处理大小,利用可用的大型芯片上SRAM最大程度地重用权重,同时将激活保留在芯片上的最大可能程度。
DL2q AI堆栈和工具链
DL2q实例附带的高通AI堆栈在高通AI云和其他高通产品上提供一致的开发者体验。相同的高通AI堆栈和基本AI技术在DL2q实例和高通边缘设备上运行,为客户提供了一致的开发者体验,在其云、汽车、个人电脑、扩展现实和智能手机开发环境中具有统一的API。
工具链使实例用户可以快速上线之前训练过的模型,为实例的功能编译和优化模型,并随后在生产推理用例中部署编译的模型,步骤如下图所示。
要了解有关调整模型性能的更多信息,请参阅Cloud AI 100关键性能参数文档。
开始使用DL2q实例
在此示例中,您将使用预构建的可用DL2q AMI在EC2 DL2q实例上从Hugging Face编译和部署预训练的BERT模型,共分四个步骤。
您可以使用预构建的高通DLAMI在实例上,或者使用Amazon Linux2 AMI开始,并使用此Amazon Simple Storage Service(Amazon S3)存储桶中提供的Cloud AI 100平台和应用程序SDK构建自己的DL2q AMI: s3://ec2-linux-qualcomm-ai100-sdks/latest/
。
下面的步骤使用预构建的DL2q AMI,高通Base AL2 DLAMI。
使用SSH访问您的DL2q实例和高通Base AL2 DLAMI AMI,并按照步骤1至4进行操作。
步骤1.设置环境并安装所需的软件包
-
安装Python 3.8。
sudo amazon-linux-extras install python3.8
-
设置Python 3.8虚拟环境。
python3.8 -m venv /home/ec2-user/userA/pyenv
-
激活Python 3.8虚拟环境。
source /home/ec2-user/userA/pyenv/bin/activate
-
安装所需的软件包,详细内容请参见高通公共Github站点上requirements.txt文档。
pip3 install -r requirements.txt
-
导入必要的库。
import transformers from transformers import AutoTokenizer, AutoModelForMaskedLMimport sysimport qaicimport osimport torchimport onnxfrom onnxsim import simplifyimport argparseimport numpy as np
步骤2. 导入模型
-
导入和标记化模型。
model_card = 'bert-base-cased'model = AutoModelForMaskedLM.from_pretrained(model_card)tokenizer = AutoTokenizer.from_pretrained(model_card)
-
定义一个示例输入并提取
inputIds
和attentionMask
。sentence = "The dog [MASK] on the mat."encodings = tokenizer(sentence, max_length=128, truncation=True, padding="max_length", return_tensors='pt')inputIds = encodings["input_ids"]attentionMask = encodings["attention_mask"]
-
将模型转换为ONNX格式,然后可以传递给编译器。
# 设置动态维度dynamic_dims = {0: 'batch', 1 : 'sequence'}dynamic_axes = { "input_ids" : dynamic_dims, "attention_mask" : dynamic_dims, "logits" : dynamic_dims}input_names = ["input_ids", "attention_mask"]inputList = [inputIds, attentionMask]torch.onnx.export( model, args=tuple(inputList), f=f"{gen_models_path}/{model_base_name}.onnx", verbose=False, input_names=input_names, output_names=["logits"], dynamic_axes=dynamic_axes, opset_version=11,)
-
您将在FP16精度下运行模型。因此,您需要检查模型是否包含FP16范围之外的任何常数。将模型传递给
fix_onnx_fp16
函数,以生成需要的修复的新ONNX文件。from onnx import numpy_helper def fix_onnx_fp16( gen_models_path: str, model_base_name: str,) -> str: finfo = np.finfo(np.float16) fp16_max = finfo.max fp16_min = finfo.min model = onnx.load(f"{gen_models_path}/{model_base_name}.onnx") fp16_fix = False for tensor in onnx.external_data_helper._get_all_tensors(model): nptensor = numpy_helper.to_array(tensor, gen_models_path) if nptensor.dtype == np.float32 and ( np.any(nptensor > fp16_max) or np.any(nptensor < fp16_min) ): # print(f'tensor value : {nptensor} above {fp16_max} or below {fp16_min}') nptensor = np.clip(nptensor, fp16_min, fp16_max) new_tensor = numpy_helper.from_array(nptensor, tensor.name) tensor.CopyFrom(new_tensor) fp16_fix = True if fp16_fix: # Save FP16 model print("Found constants out of FP16 range, clipped to FP16 range") model_base_name += "_fix_outofrange_fp16" onnx.save(model, f=f"{gen_models_path}/{model_base_name}.onnx") print(f"Saving modified onnx file at {gen_models_path}/{model_base_name}.onnx") return model_base_namefp16_model_name = fix_onnx_fp16(gen_models_path=gen_models_path, model_base_name=model_base_name)
步骤3. 编译模型
使用qaic-exec
命令行界面(CLI)编译器工具来编译模型。该编译器的输入是步骤2生成的ONNX文件。编译器将在-aic-binary-dir
参数定义的路径中生成一个二进制文件(称为QPC,Qualcomm程序容器)。
在下面的编译命令中,您使用四个AI计算核心和批处理大小为1来编译模型。
/opt/qti-aic/exec/qaic-exec \-m=bert-base-cased/generatedModels/bert-base-cased_fix_outofrange_fp16.onnx \-aic-num-cores=4 \-convert-to-fp16 \-onnx-define-symbol=batch,1 -onnx-define-symbol=sequence,128 \-aic-binary-dir=bert-base-cased/generatedModels/bert-base-cased_fix_outofrange_fp16_qpc \-aic-hw -aic-hw-version=2.0 \-compile-only
QPC生成在bert-base-cased/generatedModels/bert-base-cased_fix_outofrange_fp16_qpc
文件夹中。
第四步 运行模型
设置一个会话来在DL2q实例中的Cloud AI100 Qualcomm加速器上运行推理。
Qualcomm qaic Python库是一组API,用于支持在Cloud AI100加速器上运行推理。
-
使用会话API调用创建一个会话实例。会话API调用是使用qaic Python库的入口点。
qpcPath = 'bert-base-cased/generatedModels/bert-base-cased_fix_outofrange_fp16_qpc'bert_sess = qaic.Session(model_path= qpcPath+'/programqpc.bin', num_activations=1) bert_sess.setup() # 将网络加载到设备上。 # 这里我们读取所有的输入和输出形状/类型input_shape, input_type = bert_sess.model_input_shape_dict['input_ids']attn_shape, attn_type = bert_sess.model_input_shape_dict['attention_mask']output_shape, output_type = bert_sess.model_output_shape_dict['logits']# 为给定的输入句子创建输入字典input_dict = {"input_ids": inputIds.numpy().astype(input_type), "attention_mask" : attentionMask.numpy().astype(attn_type)}# 在Cloud AI 100上运行推理output = bert_sess.run(input_dict)
-
使用
output_shape
和output_type
从输出缓冲区重构数据。token_logits = np.frombuffer(output['logits'], dtype=output_type).reshape(output_shape)
-
解码输出结果。
mask_token_logits = torch.from_numpy(token_logits[0, mask_token_index, :]).unsqueeze(0)top_5_results = torch.topk(mask_token_logits, 5, dim=1)print("来自Qualcomm Cloud AI 100的模型输出(前5个):")for i in range(5): idx = top_5_results.indices[0].tolist()[i] val = top_5_results.values[0].tolist()[i] word = tokenizer.decode([idx]) print(f"{i+1} :(word={word}, index={idx}, logit={round(val,2)})")
以下是输入句子”The dog [MASK] on the mat.”的输出结果
1 :(word=sat, index=2068, logit=11.46)2 :(word=landed, index=4860, logit=11.11)3 :(word=spat, index=15732, logit=10.95)4 :(word=settled, index=3035, logit=10.84)5 :(word=was, index=1108, logit=10.75)
就是这样。只需几个步骤,你就可以在Amazon EC2 DL2q实例上编译和运行一个PyTorch模型。要了解有关在DL2q实例上安装和编译模型的更多信息,请参阅Cloud AI100教程文档。
要了解哪些DL模型架构适合AWS DL2q实例以及当前模型的支持矩阵,请参阅Qualcomm Cloud AI100文档。
立即可用
您可以立即在美国西部(俄勒冈州)和欧洲(法兰克福)的AWS区域中启动DL2q实例,作为按需、预留和竞价实例,或作为Savings Plan的一部分。与Amazon EC2一样,您只需支付您实际使用的费用。有关更多信息,请参阅Amazon EC2定价。
DL2q实例可以使用AWS深度学习AMI (DLAMI)进行部署,并且可以通过托管服务(如Amazon SageMaker、Amazon Elastic Kubernetes Service (Amazon EKS)、Amazon Elastic Container Service (Amazon ECS)和AWS ParallelCluster)提供容器镜像。
要了解更多信息,请访问Amazon EC2 DL2q实例页面,并通过AWS re:Post for EC2或您通常的AWS支持联系人提供反馈。