Are you sure you want to delete this task? Once this task is deleted, it cannot be recovered.
zhou_jian b2f8122327 | 5 months ago | |
---|---|---|
LICENSE | 5 months ago | |
README.md | 5 months ago | |
赛题材料.md | 5 months ago |
硬件:NPU + 910A
MindSpore:2.2 (云脑-调试任务-启智集群-npu-镜像-mindspore2.2_cann7_xianxing)
MindSpore Lite:2.2
主要任务是优化 FlashAttention 2.0 算子或者完成 FlashAttention 3.0 算子开发。
算子优化完之后,使用 StableDiffusion1.5 模型(代码链接见下文)基于给定的输入使用 MindSpore Lite 进行推理,生成的结果再与给定的标准结果进行比对,保证绝对误差在 3% 以内。推理的性能要优于提供的基线性能,推理的时间越短越好。验证的时候模型会对数据集里面的 100 条数据进行全部推理,性能会取 100 次推理的平均性能。性能和精度计算可使用 benchmark 里面的工具。
代码格式参考官方给定的代码格式,见下文“现有 MindSpore Lite 使用的 tik 版本的 FlashAttention”,比赛最终会对作品进行代码审核。
选手需要提供开发的所有代码,并提供自验报告,报告内容包含运行部分结果截图,自验的精度截图,自验的性能截图。
FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness(https://arxiv.org/pdf/2205.14135.pdf)
Flash-Decoding for long-context inference(https://crfm.stanford.edu/2023/10/12/flashdecoding.html)
为了避免随机性的干扰,这里提供了标准的10组输入输出数据,可用于精度测试,10组数据全部通过才算精度达标。
模型输入和标准模型输出的数据集链接: https://openi.pcl.ac.cn/xianxing_cup/xianx202311300909289/datasets,文件名为:data.zip。
模型文件已经上传启智社区:https://openi.pcl.ac.cn/xianxing_cup/xianx202311300909289/datasets,model.onnx 为模型文件,weights.zip 为权重文件。
2023年11月30日 - 2023年12月19日 18:00
选手每日提供信息,每日早上公布榜单。
按照比赛最后一次更新的榜单为准。
SD1.5模型简介:
https://huggingface.co/runwayml/stable-diffusion-v1-5
具体模型链接:
https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/onnx/unet
MindSpore安装:
https://www.mindspore.cn/install/
MindSpore基础教程:
https://www.mindspore.cn/tutorials/zh-CN/r2.0/index.html
MindFormers 大模型套件:
https://gitee.com/mindspore/mindformers/tree/master
MindSpore Lite相关教程:
https://www.mindspore.cn/lite/docs/zh-CN/r2.2/index.html
MindSpore Lite 的参考资料:
现有 MindSpore Lite 使用的 tik 版本的 FA 的链接:
d8d4a26ca5/mindspore/lite/tools/kernel_builder/ascend/tbe_and_aicpu/tbe/impl/flash_attention.py
下载 MindSpore Lite 2.2.10 版本包,包位置:
https://repo.mindspore.cn/public/mindspore/mindspore/gate/20231201/yefeng24_62670_293106_20231201140104_d01f986e64de2bf572bad1abb41b04427f723b44/lite/linux_aarch64/cloud_fusion/python37/
命令:
wget https://repo.mindspore.cn/public/mindspore/mindspore/gate/20231201/yefeng24_62670_293106_20231201140104_d01f986e64de2bf572bad1abb41b04427f723b44/lite/linux_aarch64/cloud_fusion/python37/mindspore-lite-2.2.10-linux-aarch64.tar.gz
tar -xzvf mindspore-lite-2.2.10-linux-aarch64.tar.gz
文件位置:https://openi.pcl.ac.cn/xianxing_cup/xianx202311300909289/datasets
下载命令:
mkdir model
cd ./model
wget -O weights.zip "https://open-data.obs.cn-south-222.ai.pcl.cn:443/attachment/6/6/66654e6c-c042-455b-993f-672577a03d0f/weights.zip?response-content-disposition=attachment%3B+filename%3D%22weights.zip%22&AWSAccessKeyId=ZSCXA9TLRN1USYWIF7A5&Expires=1702017799&Signature=VpIz9nvc8VATDeTCbV2lUz6KyQY%3D"
unzip weights.zip
wget -O model.onnx "https://open-data.obs.cn-south-222.ai.pcl.cn:443/attachment/e/f/efa11dcf-6968-4ce6-9455-0f6dbae7dcfa/model.onnx?response-content-disposition=attachment%3B+filename%3D%22model.onnx%22&AWSAccessKeyId=ZSCXA9TLRN1USYWIF7A5&Expires=1702017799&Signature=avuKmGnJjRufHsn3ZyeR50yplRw%3D"
cd ..
wget -O data.zip "https://open-data.obs.cn-south-222.ai.pcl.cn:443/attachment/1/a/1a7de4d4-fb21-451f-879e-f23aa50e06ca/data.zip?response-content-disposition=attachment%3B+filename%3D%22data.zip%22&AWSAccessKeyId=ZSCXA9TLRN1USYWIF7A5&Expires=1702456451&Signature=tKmmKevGN%2Fv0mTMWddhhNtfWyZI%3D"
unzip data.zip
补充说明:如果下载数据集出现错误可以尝试将文件链接的英文单双引号做互换尝试。
目前flashAttention针对Ascend310P和Ascend910A的机器支持stable diffusion系列模型的FlashAttention融合,由于目前 Ascend310P 和 Ascend910A 使用的是tik版本的 FlashAttention 算子实现,所以支持场景有限。
最新版的 FlashAttention 算子实现:d8d4a26ca5/mindspore/lite/tools/kernel_builder/ascend/tbe_and_aicpu/tbe/impl/flash_attention.py,优化和开发新的FA算子的代码格式可参考这个文档。
cp flash_attention.py /home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/tools/custom_kernels/ascend/tbe_and_aicpu/packages/vendors/mslite_tbe_and_aicpu/op_impl/vector_core/tbe/mslite_tbe_and_aicpu_impl
cd /home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/tools/custom_kernels/ascend/tbe_and_aicpu
echo $ASCEND_OPP_PATH # 如果为 /usr/local/Ascend/ascend-toolkit/latest/opp 则不用修改 ASCEND_OPP_PATH,跳过下面一步,如果不是则修改代码如下:
export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp # 根据自己cann包安装位置实际修改
bash install.sh
显示SUCCESS为安装成功
注意:启智 notebook 调试任务关闭重新启动以后需要重新安装一下。
目前在Ascend310P以及Ascend910A上使用的是tik版本的自定义FlashAttention算子,实现相对简单定制,所以使用场景有限,更加范化的场景,建议使用910B上的内置算子实现。
以下用SD1.5Unet进行示例
config.ini
可在 /home/ma-user/work/ 目录下创建 config.ini 文档,内容参考如下:
[ascend_context]
plugin_custom_ops=All
# 设置需要融合的算子名称,具体的设置方式参考下文注释部分
custom_fusion_pattern="FlashAttention:/down_blocks.0/attentions.0/transformer_blocks.0/attn1/Softmax,/down_blocks.0/attentions.1/transformer_blocks.0/attn1/Softmax,/up_blocks.3/attentions.0/transformer_blocks.0/attn1/Softmax,/up_blocks.3/attentions.1/transformer_blocks.0/attn1/Softmax,/up_blocks.3/attentions.2/transformer_blocks.0/attn1/Softmax:enable"
# 如果是想测试提供的 FA 文件用上面的就行,下面的可忽略
[acl_build_options]
input_format="ND"
# 设置动态分档
input_shape="sample:1,4,-1,-1;timestep:1;encoder_hidden_states:1,154,768;down_block_0:1,320,-1,-1;down_block_1:1,320,-1,-1;down_block_2:1,320,-1,-1;down_block_3:1,320,-1,-1;down_block_4:1,640,-1,-1;down_block_5:1,640,-1,-1;down_block_6:1,640,-1,-1;down_block_7:1,1280,-1,-1;down_block_8:1,1280,-1,-1;down_block_9:1,1280,-1,-1;down_block_10:1,1280,-1,-1;down_block_11:1,1280,-1,-1;mid_block_additional_residual:1,1280,-1,-1"
# 设置动态分档的不同档位信息
ge.dynamicDims="96,96,96,96,96,96,96,96,48,48,48,48,48,48,24,24,24,24,24,24,12,12,12,12,12,12,12,12;96,72,96,72,96,72,96,72,48,36,48,36,48,36,24,18,24,18,24,18,12,9,12,9,12,9,12,9"
custom_fusion_pattern
使用方式:
# "算子类型名字:模型中融合成大算子结构中任意一个算子名字(多个名字逗号分割):enable"
# "算子类型名字:模型中融合成大算子结构中任意一个算子名字(多个名字逗号分割):disable"
custom_fusion_pattern="FlashAttention:name_1,name_2,name_3:enable"
设置动态链接库:
export LD_LIBRARY_PATH=/home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/tools/converter/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/runtime/lib:${LD_LIBRARY_PATH}
注意:启智 notebook 调试任务关闭重新启动以后需要重新设置动态链接库。
转换工具目录:
在 /home/ma-user/work/ 目录下,新建 config.ini 文件,文件内容如下:
cd /home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/tools/converter/converter
./converter_lite --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --modelFile=/home/ma-user/work/model/model.onnx --outputFile=model_npu --inputShape="sample:1,4,96,96;timestep:1;encoder_hidden_states:1,154,768;down_block_0:1,320,96,96;down_block_1:1,320,96,96;down_block_2:1,320,96,96;down_block_3:1,320,48,48;down_block_4:1,640,48,48;down_block_5:1,640,48,48;down_block_6:1,640,24,24;down_block_7:1,1280,24,24;down_block_8:1,1280,24,24;down_block_9:1,1280,12,12;down_block_10:1,1280,12,12;down_block_11:1,1280,12,12;mid_block_additional_residual:1,1280,12,12" --configFile=/home/ma-user/work/config.ini
说明:如果没有优化更新算子,只是测试 SD1.5 推理的话可将 “--configFile=./unet/config.ini” 参数去掉运行。模型转换 “--modelFile” 参数写.oonx模型文件就行,.pd文件为权重文件,两个文件要放在同一个目录下,转换的时候模型文件会自动读取.pd权重文件。
具体的
converter_lite
工具使用教程可以参考mindspore lite官网。
显示CONVERT RESULT SUCCESS:0
表示模型转换成功,中间存在ERROR
日志可以忽略,错误日志显示的是模型超过2G大小,是pb的内存限制问题。
benchmark
工具验证模型推理去到工具目录运行如下代码:
性能测试:
/home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/tools/benchmark/benchmark --modelFile=/home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/tools/converter/converter/model_npu_graph.mindir --device=Ascend
精度测试:
/home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/tools/benchmark/benchmark --modelFile=/home/ma-user/work/mindspore-lite-2.2.10-linux-aarch64/tools/converter/converter/model_npu_graph.mindir --device=Ascend --inDataFile=/home/ma-user/work/data/model.onnx.bin0.num_0,/home/ma-user/work/data/model.onnx.bin1.num_0,/home/ma-user/work/data/model.onnx.bin2.num_0,/home/ma-user/work/data/model.onnx.bin3.num_0,/home/ma-user/work/data/model.onnx.bin4.num_0,/home/ma-user/work/data/model.onnx.bin5.num_0,/home/ma-user/work/data/model.onnx.bin6.num_0,/home/ma-user/work/data/model.onnx.bin7.num_0,/home/ma-user/work/data/model.onnx.bin8.num_0,/home/ma-user/work/data/model.onnx.bin9.num_0,/home/ma-user/work/data/model.onnx.bin10.num_0,/home/ma-user/work/data/model.onnx.bin11.num_0,/home/ma-user/work/data/model.onnx.bin12.num_0,/home/ma-user/work/data/model.onnx.bin13.num_0,/home/ma-user/work/data/model.onnx.bin14.num_0,/home/ma-user/work/data/model.onnx.bin15.num_0, --benchmarkDataFile=/home/ma-user/work/data/model.onnx.out.num_0 --accuracyThreshold=1
具体的
benchmark
工具使用教程可以参考mindspore lite官网。
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》