生成式人工智能的崛起是技术和创新的一个重要里程碑。这场革命的定义是机器创造内容的能力 – 如文本、图像、音乐,甚至整个虚拟世界 – 这些内容几乎与人造输出无法区分。在先进算法和大型数据集的推动下,生成式人工智能已经超越了传统计算的极限,在多个领域提供了非凡的创造力、自动化和解决问题的能力。
在生成式人工智能中,最具突破性的进步是大语言模型(LLM)。这类模型在多样而广泛的数据集上进行了训练,具有理解和生成类人文本的能力,促进了从自然语言处理到会话人工智能的无数应用。大语言模型(例如:OpenAI推出的著名生成型预训练变换模型系列,Meta和其他组织推出的LlaMa系列模型已经彻底改变了人类与机器的交互方式,实现了更直观和情境感知的通信。
由于最近技术的进步和边缘设备上计算能力的提高 – 由于位于边缘、复杂性越来越高的高性能核心,例如GPU、多核CPU和NPU – 加上越来越多的隐私问题,有必要在边缘设备上实时运行大语言模型(以及其他推理)。
智能手机、物联网设备等现代边缘设备能够运行大量的大语言模型,在本地执行复杂的推理,而无需依赖基于云的服务。将大语言模型集成到边缘设备中为在医疗保健、汽车和消费电子等各个领域提供高度个性化和情境感知交互提供了大量新机会。因此,先进的人工智能模型和边缘计算之间的协同作用代表了一种向更快响应、更安全、更个性化和更智能的技术生态系统的范式转换。
高通Adreno GPU是深度学习模型领域的强大资产,可提供强大的计算能力,对于处理与人工智能应用相关的密集工作负载至关重要。Adreno GPU采用先进的图形和并行处理架构设计,擅长加速深度学习模型的机器学习推理过程。Adreno GPU已可以支持在 OpenCL框架框架上运行各种深度学习模型。此外,骁龙神经处理引擎 (SNPE) SDK是一款高性能神经网络运行时,可以在骁龙移动平台上高效运行各种深度学习模型。骁龙神经处理引擎 (SNPE) 支持Adreno GPU委托,以运行深度学习模型。
高通技术公司致力于各种开源倡议,通过社区驱动项目不断努力提高其硬件功能。通过支持开源协作,高通技术公司不仅加速了创新,而且使尖端技术的使用大众化。Adreno GPU提供了对标准OpenCL和Vulkan框架的强大支持,此外还支持能够实现高效和高性能执行的专有扩展程序。
本文介绍了在Adreno GPU上支持生成式人工智能模型的开源解决方案。我们从机器学习编译器-大语言模型 (MLC LLM) 开始,这是一种 具有机器学习编译功能的通用大语言模型部署引擎。机器学习编译器-大语言模型支持各种后端,例如统一计算设备架构, Vulkan, OpenCL。通过我们的努力,显著提高了Adreno GPU的OpenCL后端性能。这些增强性能大部分已经回馈给了社区。由于社区的合作,我们现在可以在Adreno GPU上支持各种大语言模型。
为什么MLC-LLM推理框架?
MLC-LLM是一个社区驱动的项目,做出了重大贡献并添加了新模型。MLC-LLM以张量虚拟机(TVM)为核心。多年以来,高通技术公司一直在为TVM所支持的Adreno GPU做出贡献并提供维护。通过TVM,我们为视觉(或非生成式人工智能)模型提供了具有卓越性能的开源解决方案。现在,我们很自豪地重申高通技术公司的承诺和宗旨,即MLC/TVM为Adreno GPU上的生成式人工智能模型提供基于开源的解决方案。
我们的优势
- 增强性能:我们在MLC-LLM项目中对Adreno GPU目标进行了优化,普遍显著提高了所有支持模型的大语言模型性能。性能改进不仅限于解码(每秒token数),还包括提示(首次生成token时间)处理。
- 平台覆盖:MLC-LLM解决方案适用于Android(或Linux)以及Windows平台,只要可以获得OpenCL 3.0支持。有关在各自平台上构建和运行的详细信息,请参阅文档。标准windows平台是搭载骁龙X Elite 和骁龙X Plus处理器或平台的windows 11设备,以及搭载骁龙 8 Gen 1/2/3(处理器或平台)和最新骁龙8 Elite 的Android智能手机。
- 文档:有足够的文档指导开发者为所支持的平台构建大语言模型,就像我们构建目标二进制文件(如MLC/TVM运行时和其他实用程序)的指令一样。
- 开源:所有优化、额外工具和文档都可以通过机器学习编译器公共程序库以及高通技术公司托管和测试的公共程序库获得。
开始使用:
Adreno GPU的MLC-LLM解决方案可从位于 mlc-llm的主线项目获取。在具有高通技术补充内容的mlc-llm 上,可以获得利用专门文档和额外工具在Adreno GPU上测试的解决方案衍生版本。
作为附加价值,我们还提供经过测试的MLC和TVM构建工件,以进行新模型编译,目标实用程序在Adreno GPU发布工件中提供。
在Adreno文档中为社区提供了具有全部说明的文档。
在Adreno GPU上创建原型的大语言模型可用于Adreno、 Linux和Windows平台。一般来说,Linux和Android平台的模型编译过程是通过Linux主机完成的,而对于Windows平台,我们需要一个Windows主机。
Linux和Windows平台的指令几乎完全相似。下文说明可以帮助您从主机设置、软件开发工具包安装、模型编译、和在目标平台上运行模型开始快速入门。
Linux:
主机准备:
conda create -n mlc-venv -c conda-forge "llvmdev=15" "cmake>=3.24" git rust numpy decorator psutil typing_extensions scipy attrs git-lfs gcc=10.4 gxx=10.4 python=3.8
conda activate mlc-venv
pip install torch==2.2.0 torchvision==0.18.0 torchaudio==2.3.0
软件开发工具包安装:
SDK可以在 Adreno GPU发布工件中以python程序包的形式获得。
pip install tvm_adreno_mlc_cpu-0.19.dev0-cp38-cp38-manylinux_2_28_x86_64.whl
pip install mlc_llm_adreno_cpu-0.1.dev0-cp38-cp38-manylinux_2_28_x86_64.whl
#Check installation status
python -c "import tvm; print(tvm.__path__)"
python -c "import mlc_llm; print(mlc_llm.__path__)"
您也可以按照下文说明下载实用程序和解压文件:
mlc_llm-utils-linux-arm64
├── bin
│ └── mlc_cli_chat
└── lib
├── libmlc_llm_module.so
├── libmlc_llm.so
└── libtvm_runtime.so
Windows:
主机准备:
conda create -n mlc-venv -c conda-forge "llvmdev=15" "cmake>=3.24" git rust numpy==1.26.4 decorator psutil typing_extensions scipy attrs git-lfs python=3.12 onnx clang_win-64
conda activate mlc-venv
pip install torch==2.2.0 torchvision==0.18.0 torchaudio==2.3.0
软件开发工具包安装:
pip install tvm_adreno_cpu-0.19.dev0-cp312-cp312-win_amd64.whl
pip install mlc_llm_adreno_cpu-0.1.dev0-cp312-cp312-win_amd64.whl
#检查安装状态
python -c "import tvm; print(tvm.__path__)"\
python -c "import mlc_llm; print(mlc_llm.__path__)"
您也可以按照下文说明下载实用程序和解压文件:
mlc_llm-utils-win-x86
bin
├── mlc_cli_chat.exe
├── mlc_llm.dll
├── mlc_llm_module.dll
└── tvm_runtime.dll
示例模型:
让我们考虑一个用于演示模型编译、目标设置、目标部署、和运行模型整个流程的示例模型。可以从Huggingface(https://huggingface.co)或任何其他来源下载大语言模型。
模型编译完全通过python实用程序mlc_llm完成。这一过程在windows或Linux中很常见,只是做了一些小的修改。
给定位于Meta -Llama-3-8B-Iinstruct文件夹项下的Meta-Llama-3-8B-Instruct。
编译过程包括下文说明的各个阶段:
模型编译:
大语言模型的编译包括配置生成、参数量化和模块构建,如下图所示
配置生成
python -m mlc_llm gen_config \
<SOURCE_MODEL> \
--quantization q4f16_0 \
--conv-template <MODEL_TEMPLATE> \
--prefill-chunk-size 256 \
<ADDITIONAL_OPTIONS> \
-o <MODEL_OUTPUT_PATH>
参数量化
python -m mlc_llm convert_weight \
<SOURCE_MODEL>
--quantization q4f16_0
-o <MODEL_OUTPUT_PATH>
-o <MODEL_OUTPUT_PATH>
模型构建
python -m mlc_llm compile
<MODEL_OUTPUT_PATH>/mlc-chat-config.json
--device <DEVICE_CONFIG>
-o <MODEL_LIB>
对于Android或Linux平台,设备配置(DEVICE_CONFIG)为“android: adrenoo-so”;对于windows平台,设备配置为“windows:adreno_x86”。
例如,Meta-Llama-3-8B-Instruct模型可以在Linux上针对Adreno GPU目标(Android目标)编译为
#生成配置
python -m mlc_llm gen_config \
./dist/models/Llama-2-7b-chat-hf \
--quantization q4f16_0 \
--conv-template llama-2 \
--prefill-chunk-size 256 \
-o ./dist/Llama-2-7b-chat-hf-q4f16_0-MLC
#量化参数
python3 -m mlc_llm convert_weight \
./dist/models/Llama-2-7b-chat-hf \
--quantization q4f16_0 \
-o ./dist/Llama-2-7b-chat-hf-q4f16_0-MLC
#为Linux / Android Adreno GPU目标编译模型
python3 -m mlc_llm compile \
./dist/Llama-2-7b-chat-hf-q4f16_0-MLC/mlc-chat-config.json \
--device android:adreno-so \
-o ./dist/libs/Llama-2-7b-chat-hf-q4f16_0-adreno.so
此时我们需要选择的工件是位于./dist/ llama-2-7b-chat-hf-q4f16_0-MLC的量化权重,以及位于./dist/libs/Llama-2-7b-chat-hf-q4f16_0-adreno.so的模型库。
同样可以在Windows环境下针对Windows上的Adreno GPU进行如下编译
#生成配置
python -m mlc_llm gen_config \
./dist/models/Llama-2-7b-chat-hf \
--quantization q4f16_0 \
--conv-template llama-2 \
--prefill-chunk-size 256 \
-o ./dist/Llama-2-7b-chat-hf-q4f16_0-MLC
#量化参数
python3 -m mlc_llm convert_weight \
./dist/models/Llama-2-7b-chat-hf \
--quantization q4f16_0 \
-o ./dist/Llama-2-7b-chat-hf-q4f16_0-MLC
#为Windows Adreno GPU目标编译模型
python3 -m mlc_llm compile \
./dist/Llama-2-7b-chat-hf-q4f16_0-MLC/mlc-chat-config.json \
--device windows:adreno_x86 \
-o ./dist/libs/Llama-2-7b-chat-hf-q4f16_0-adreno.dll
同样,此时我们需要选择的工件是位于./dist/Llama-2-7b-chat-hf-q4f16_0-MLC的量化权重,以及位于./dist/libs/Llama-2-7b-chat-hf-q4f16_0-adreno.dll的模型库。
在技术方面,量化权重对于任何Adreno GPU目标都是相同的,因为我们在整个过程中使用相同的量化。
在Adreno GPU上部署和运行:
对于Linux(或Android)和Windows目标而言,使用本机命令行接口运行的模型非常相似。此外,Windows也支持基于python命令行接口的运行。
Linux或Android
我们使用预编译的目标命令行接口实用工具mlc_llm-utils-lihux-arm64.tar.bz2。它具有命令行接口工具mlc_cli及其依赖项,如下所示。
mlc_llm-utils-linux-arm64
├── bin
│ └── mlc_cli_chat
└── lib
├── libmlc_llm_module.so
├── libmlc_llm.so
└── libtvm_runtime.so
将这些内容推送到运行Linux或Android操作系统的Adreno GPU目标
此外,将构建工件从经过编译的工件dist/Llama-2-7b-chat-hf-q4f16_0-MLC和dist/libs/Llama-2-7b-chat-hf-q4f16_0-adreno.so主机推送到目标。
现在,以下命令可以启动命令行接口上的聊天
LD_LIBRARY_PATH=./libs ./mlc_cli_chat --model <PATH to Llama-2-7b-chat-hf-q4f16_0-MLC> --model-lib <PATH to Llama-2-7b-chat-hf-q4f16_0-adreno.so> --device opencl
Windows
Windows支持运行编译模型的Python方式以及本机命令行接口方法。
本机命令行接口
我们使用预编译的目标命令行接口实用工具mlc_llm-utils-win-x86.tar.bz2。它具有命令行接口工具mlc_cli.exe及其依赖项,如下所示。
mlc_llm-utils-win-x86
bin
├── mlc_cli_chat.exe
├── mlc_llm.dll
├── mlc_llm_module.dll
└── tvm_runtime.dll
现在,将构建工件从编译工件dist/Llama-2-7b-chat-hf-q4f16_0-MLC和dist/libs/Llama-2-7b-chat-hf-q4f16_0-adreno.dll主机推送到目标。
另外,在目标下面的命令可以启动其进行交互式聊天
mlc_cli_chat.exe --model <PATH to Llama-2-7b-chat-hf-q4f16_0-MLC> --model-lib <PATH to Llama-2-7b-chat-hf-q4f16_0-adreno-accl.so> --device opencl
Python命令行接口
按照下文说明,准备与Windows主机相同、由骁龙X Elite处理器驱动的目标设备。
Install Anaconda from Anaconda Documentation - Anaconda
从Anaconda Documentation - Anaconda安装Anaconda
利用以下配置创建一个Anaconda环境:
conda create -n mlc-venv -c conda-forge "llvmdev=15" "cmake>=3.24" git rust numpy decorator psutil typing_extensions scipy attrs git-lfs python=3.12 onnx clang_win-64
conda activate mlc-venv
从发布版下载机器学习编译器-大语言模型(Windows)程序包
现在,按照下文说明安装程序包:
pip install tvm_adreno_cpu-0.19.dev0-cp312-cp312-win_amd64.whl
pip install mlc_llm_adreno_cpu-0.1.dev0-cp312-cp312-win_amd64.whl
核对安装状态如下:
python -c "import tvm; print(tvm.__path__)"\
python -c "import mlc_llm; print(mlc_llm.__path__)"
现在,将构建工件dist/Llama-2-7b-chat-hf-q4f16_0-MLC和dist/libs/ llama -2-7b-chat-hf-q4f16_0- adrenno –win.so从主机复制到Adreno Windows设备。
在具有mlc-venc环境的Anaconda shell下,执行以下命令:
python -m mlc_llm chat --device opencl --model-lib ./dist/libs/Llama-2-7b-chat-hf-q4f16_0-adreno-win-accl.so ./dist/Llama-2-7b-chat-hf-q4f16_0-MLC/
模型覆盖
骁龙8 Gen 3 | 骁龙X Elite(Windows) | 骁龙8 Elite | |||||||
模型 | 解码为100(toks/秒) | 编码为256提示 | 编码为256提示 | 编码为256提示 | |||||
toks/秒 | 首个toks生成时间 | 解码为100(toks/秒) | toks/秒 | 首个toks生成时间 | 解码为100(toks/秒) | toks/秒 | 首个toks生成时间 | ||
Llama-2-7b-chat-hf | 14 | 88 | 2.89 | 20 | 104 | 2.45 | 14.34 | 92.5 | 2.7 |
Meta-Llama-3-8B-Instruct | 11.1 | 80.5 | 3.16 | 17 | 95 | 2.7 | 12.5 | 84.6 | 3.01 |
gemma-2b-it | 14.77 | 244.7 | 1.02 | 41 | 330 | 0.77 | 33.25 | 293.5 | 0.85 |
Mistral-7B-Instruct-v0.2 | 10.85 | 64.1 | 3.9 | 16.3 | 75 | 3.3 | 11.5 | 71 | 3.5 |
phi-2 | 28.9 | 137.7 | 1.98 | 42.8 | 203.5 | 1.25 | 30 | 145.4 | 1.86 |
Phi-3-mini-4k-instruct | 22.6 | 145.5 | 1.75 | 33.5 | 169.3 | 1.5 | 24.88 | 156.358 | 1.64 |
Qwen-7B-Chat | 12.3 | 72.3 | 3.6 | 15.7 | 101.7 | 2.5 | 11.9 | 72.5 | 3.59 |
llava-1.5-7b-hf | 13.3 | 85.8 | 2.9 | 21 | 119 | 2.15 | 13.1 | 85.6 | 2.9 |
由于进行了非常通用的优化,理想情况下,由MLC-LLM项目官方支持的每个模型都应该在Adreno GPU目标上工作。以下是我们在几个平台上对Adreno GPU上进行基准测试的知名大语言模型列表。
社区提供的机器学习编译器支持下文列出的一系列模型,尽管我们没有对所有这些模型进行基准测试或性能评估。
Meta公司的Llama:llama2_7b、llama2_13b、llama2_70b、llama3_1_8b、llama3_1_70b、codellama_7b、codellama_13b、codellama_34b、tinyllama_1b_chat_v0.4、tinyllama_1b_chat_v1.0
Mistral AI:mistral_7b、mistral_7b_v03、Mixtral-8x7B-v0.1
OpenAI:gpt2, gpt2_medium, gpt_bigcode
Together Ai:redpajama_3b_v1
微软公司的Phi:phi-1_5、phi-2, phi-3_5、phi-3_5版本
Qewn: qwen、qwen2、qwen2moe、qwen2_0_5b、qwen2_1_5b、qwen2.5_3b、qwen2_7b
Stability AI:stablelm
百川大模型:baichuan
InternLM: internlm.、internlm2、internlm2_5_7b
谷歌:gemma2_2b、gemma2_9b、gemma2_27b
SmolLM:smollm_1_7b、smollm_360m、smollm_135m
MiniCPM:minicpm_2b、minicpm_2b_sft_bf16、minicpm-moe-8x2b
其他:rwkv5_3b、orion、llava、chatglm、snowflake-arctic-embed-m、stablelm-2-zephyr-1_6b、starcoder2、aya-23
未来工作
高通技术公司坚定不移地致力于持续投资于增强Adreno GPU的开源解决方案。通过积极参与和优化MLC-LLM等项目,高通公司意图为开发者提供充分利用Adreno GPU功能所需要的工具和资源。
未来,通过对性能和功率切线范围内Adreno GPU硬件的深入理解,我们会继续增加模型覆盖和优化。
结论
我们鼓励社区开发者尝试使用这些优化,并在本公司的开发者Discord上分享他们的反馈。您的经验和见解在帮助我们完善和提高Adreno GPU的功能方面是无价的。
敬请期待更多更新!
在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。
骁龙和高通品牌产品属于高通技术公司和/或其子公司的产品。
关于作者
希瓦·拉玛·克里希纳·雷迪·B
帕万·库马尔·A
高级工程主管
