DeepSeek-R1-Distill-Qwen-1.5B模型推理
权重加载
微调之后,最终模型包含两部分:base model和LoRA adapter
# 因果语言模型的自动建模
base_model = AutoModelForCausalLM.from_pretrained('MindSpore-Lab/DeepSeek-R1-Distill-Qwen-1.5B-FP16', mirror="modelers", ms_dtype=mindspore.float16)
mdoel = PeftModel.from_pretrained(base_model, './output/adapter_model_for_demo')
启动微调
generate_kwargs = dict(
input_ids=input_ids, # 输入
streamer=streamer,
max_new_tokens=1024, # 生成token数
do_sample=True, # 采样
top_p=0.9, # 一个阈值,先排序对概率做一个累加直到超过阈值就选这个
temperature=0.1, # mindspore.mint.softmax(logit[:, -1] / temperature, dim=-1)
num_beams=1, # beam search
)
'''
模型每次预测的词是概率最大的词(贪心搜索),再把这个词添加回
模型,自回归模型,但是模型可能输出重复或本身随机性弱,为了
让模型输出更随机一些更创新一些,需要做一些配置,例如束搜索
或按照生成的概率去概率的选。
'''
model.generate(target=model.generate, kwargs=generate_kwargs)
效果调优
再generate_kwargs中添加repetition_penalty=1.2,可解决长文本输出重复问题。
通过export INFERENCE_RECORD_TIME=True,在推理的时候可以展示每个token输出的时间。
禁用多线程
因为推理板的开销主要在host侧,npu还是比较快的,没必要开太多的线程占用资源。
from mindspore._c_expression import disable_multi_thread
disable_multi_thread()
jit即时编译
通过jit修饰器修饰Python函数或者Python类的成员函数使其被编译成计算图,通过图优化等技术提高运行速度。
虽然model.generate很好用,但是不好优化,所以需要手动实现解码逻辑。
@mindspore.jit(jit_config=mindspore.JitConfig(jit_syntax_level='STRICT'))
添加jit装饰器
- 设置O2整图下沉进一步优化
- model.jit()
- mindspore.jit装饰decode函数
KVCache
正常来讲每一次预测下一个词都需要把前面的词计算一遍,但是KVCache只需要计算一次不需要每次重复计算。