Hi,各位朋友们好!我是 KuiperInfer 的作者。KuiperInfer 作为一门开源课程,迄今已经在 GitHub 上已斩获 2.4k star。 如今在原课程的基础上,我们全新推出了《动手自制大模型推理框架》, 新课程支持Llama系列大模型(包括最新的LLama3.2),同时支持 Cuda 加速和 Int8 量化,自推出以来便广受好评。
https://l0kzvikuq0w.feishu.cn/docx/ZF2hd0xfAoaXqaxcpn2c5oHAnBc
如果你对大模型推理感兴趣,想要深入了解并掌握相关技术,那么这门课程绝对不容错过。快来加入我们,一起开启学习之旅吧! 感兴趣的同学欢迎扫一扫课程下方二维码或者添加微信 lyrry1997 参加课程
一、项目整体架构和设计
学习架构思维,防止自己只会优化局部实现
- 环境的安装和课程简介
- 资源管理和内存管理类的设计与实现
- 张量类的设计与实现
- 算子类的设计与实现
- 算子的注册和管理
二、支持LLama2模型结构
本节将为大家补齐算法工程师思维,在算法层面讲解大模型和Transformer的原理之后,开始对LLama2进行支持
- LLama模型的分析
- MMap内存映射技术打开大模型的权重文件
- LLama模型文件的参数和权重载入
- LLama中各个层的初始化以及输入张量、权重张量的分配和申请
- 实现大模型中的KV Cache机制
三、模型的量化
为了减少显存的占用,我们开发了int8模型量化模块
- 量化模型权重的导出
- 量化系数和权重的加载
- 量化乘法算子的实现
四、Cuda基础和算子实现
带你学Cuda并在实战大模型算子的实现,为大模型推理赋能
- Cuda基础入门1 - 内容待定
- Cuda基础入门2 - 内容待定
- Cuda基础入门3 - 内容待定
- Cuda基础入门4 - 内容待定
- RMSNorm算子的Cuda实现
- Softmax算子的Cuda实现
- Add算子的Cuda实现
- Swiglu算子的Cuda实现
- GEMV算子的Cuda实现
- 多头注意力机制的Cuda实现
- 让框架增加Cuda设备的支持和管理
- 完成Cuda推理流程
五、用推理框架做点有趣的事情
- 文本生成
- 讲一段小故事
- 让大模型和你进行多轮对话
六、学习其他商用推理框架的实现,查漏补缺
-
LLama.cpp的设计和实现讲解
这里有多个小节
-
Miopen(AMD出品,对标CUDNN)的设计和实现讲解
这里有多个小节
-
总结
- google glog https://github.com/google/glog
- google gtest https://github.com/google/googletest
- sentencepiece https://github.com/google/sentencepiece
- armadillo + openblas https://arma.sourceforge.net/download.html
- Cuda Toolkit
openblas作为armadillo的后端数学库,加速矩阵乘法等操作,也可以选用Intel-MKL,这个库用于CPU上的推理计算
-
LLama2 https://pan.baidu.com/s/1PF5KqvIvNFR8yDIY1HmTYA?pwd=ma8r 或 https://huggingface.co/fushenshen/lession_model/tree/main
-
Tiny LLama
- TinyLLama模型 https://huggingface.co/karpathy/tinyllamas/tree/main
- TinyLLama分词器 https://huggingface.co/yahma/llama-7b-hf/blob/main/tokenizer.model
需要其他LLama结构的模型请看下一节模型导出
python export.py llama2_7b.bin --meta-llama path/to/llama/model/7B
# 使用--hf标签从hugging face中加载模型, 指定--version3可以导出量化模型
# 其他使用方法请看export.py中的命令行参数实例
mkdir build
cd build
# 需要安装上述的第三方依赖
cmake ..
# 或者开启 USE_CPM 选项,自动下载第三方依赖
cmake -DUSE_CPM=ON ..
make -j16
./llama_infer llama2_7b.bin tokenizer.model
- 以 meta-llama/Llama-3.2-1B 为例,huggingface 上下载模型:
export HF_ENDPOINT=https://hf-mirror.com
pip3 install huggingface-cli
huggingface-cli download --resume-download meta-llama/Llama-3.2-1B --local-dir meta-llama/Llama-3.2-1B --local-dir-use-symlinks False
- 导出模型:
python3 tools/export.py Llama-3.2-1B.bin --hf=meta-llama/Llama-3.2-1B
- 编译:
mkdir build
cd build
# 开启 USE_CPM 选项,自动下载第三方依赖,前提是需要网络畅通
cmake -DUSE_CPM=ON -DLLAMA3_SUPPORT=ON ..
make -j16
- 运行:
./build/demo/llama_infer Llama-3.2-1B.bin meta-llama/Llama-3.2-1B/tokenizer.json
# 和 huggingface 推理的结果进行对比
python3 hf_infer/llama3_infer.py
- 以 Qwen2.5-0.5B 为例,huggingface 上下载模型:
export HF_ENDPOINT=https://hf-mirror.com
pip3 install huggingface-cli
huggingface-cli download --resume-download Qwen/Qwen2.5-0.5B --local-dir Qwen/Qwen2.5-0.5B --local-dir-use-symlinks False
- 导出模型:
python3 tools/export_qwen2.py Qwen2.5-0.5B.bin --hf=Qwen/Qwen2.5-0.5B
- 编译:
mkdir build
cd build
# 开启 USE_CPM 选项,自动下载第三方依赖,前提是需要网络畅通
cmake -DUSE_CPM=ON -DQWEN2_SUPPORT=ON ..
make -j16
- 运行:
./build/demo/qwen_infer Qwen2.5-0.5B.bin Qwen/Qwen2.5-0.5B/tokenizer.json
# 和 huggingface 推理的结果进行对比
python3 hf_infer/qwen2_infer.py