🤗重庆大学计算机学院毕业设计——基于MindSpore的Falcon大模型迁移与性能研究。
项目部分为华为昇思MindSpore社区开源任务,基于MindSpore的一个NLP易用开源库MindNLP https://github.com/mindlab-ai/mindnlp。 因参与昇思MindSpore社区贡献突出,获得昇思优秀开发者奖。
src目录为falcon的MindSpore实现,实验证明该版本实现与HuggingFace中模型实现在容纳误差为
export RUN_SLOW=True // 若需要进行文本生成测试(耗费时间很长)
pytest -vs tests/ut/transformers/models/falcon
train_falcon为在MindNLP框架中基于falcon-rw-1b预训练模型进行微调的代码,数据集为GLUE基准数据集中的MRPC语料,任务是语义匹配。
默认训练10epoch,因为模型本身理解能力较强,实验表明在训练5个epoch之后已基本收敛,训练好的文件已放在peft_model目录下,可直接加载。
通过mrpc_dataset.py脚本中load_examples接口自动从Hugging Face下载并加载数据集。
可通过Huggingface镜像站快速加载模型。
wget https://hf-mirror.com/hfd/hfd.sh
chmod a+x hfd.sh
./hfd.sh Rocketknight1/falcon-rw-1b --tool aria2c -x 4 # 这里选择下载规模最小的版本,若有足够的硬件支持,可下载其他版本
训练之前先确保已经下载好模型文件,文件默认存放目录为.mindnlp/model/Rocketknight1/falcon-rw-1b。
在mindnlp根目录下执行如下命令。
python llm/peft/train_falcon/train_mrpc.py \
--save_dir ".mindnlp/peft_model/falcon/mrpc_lora" \
--batch_size 8 \
--model_name_or_path ".mindnlp/model/Rocketknight1/falcon-rw-1b" \
--max_seq_len 256 \
--lora
原预计通过AOT Compiler基于高级领域特定语言(Domain-Specific Languages, DSL)Triton编写的较完备的FlashAttention实现编译得到Low Level的CUDA kernel,再通过Custom自定义算子的方式加载进MindSpore,但经研究发现,Triton AOT Compiler的编译逻辑在预定模板代码的基础上直接嵌入了通过PTX生成的cubin二进制文件,cubin文件只能在CUDA Runtime中加载运行,并不是生成kernel代码。因此,参考了代码https://github.com/tspeterkim/flash-attention-minimal/blob/main/flash.cu ,用纯CUDA C++编写了FlashAttention kernel,目前实现了FlashAttention_v1与FlashAttention_v2的正反向计算(含causal mask),但只支持静态block size与FP32数据格式,可实现3.5x-94x的加速。仓库中包含了调试FlashAttention_v1与FlashAttention_v2的的vscode调试设置与CUDA C++代码,可供初学者使用。
可在mindnlp根目录下通过以下脚本测试其正确性并通过mindsight查看性能分析结果:
# 开启mindinsight 记录算子运行耗时
mindinsight start
pytest -vs ./tests/ut/modules/test_flashattention.py
FlashAttention论文出处如下:
FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness Tri Dao, Daniel Y. Fu, Stefano Ermon, Atri Rudra, Christopher Ré Paper: https://arxiv.org/abs/2205.14135
FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning Tri Dao
Paper: https://tridao.me/publications/flash2/flash2.pdf
pip install git+https://github.com/mindspore-lab/mindnlp.git
# or
git clone https://github.com/mindspore-lab/mindnlp.git
cd mindnlp
bash scripts/build_and_reinstall.sh#安装Mindnlp
pip install git+https://github.com/mindspore-lab/mindnlp.git
pip install "mindspore>=2.2"
repo = "Rocketknight1/falcon-rw-1b"
tokenizer = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo)
model.set_train(False)
pipeline = mindnlp.transformers.pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
torch_dtype=ms.bfloat16,
trust_remote_code=True,
)
sequences = pipeline(
"Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe.\nDaniel: Hello, Girafatron!\nGirafatron:",
max_length=200,
do_sample=True,
top_k=10,
num_return_sequences=1,
eos_token_id=tokenizer.eos_token_id,
)
for seq in sequences:
print(f"Result: {seq['generated_text']}")