LLM-starcoder 搭建随记

LLM-starcoder 搭建随记

一 安装部署

1.安装Python (使用conda虚拟部署)

1.1安装miniconda

参考文档:

https://blog.csdn.net/m0_57861784/article/details/131594703

https://blog.csdn.net/zkkkkkkkkkkkkk/article/details/124924708

1.2下载安装miniconda
 wget  https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
安装(并在过程中指定位置)
bash download/Miniconda3-latest-Linux-x86_64.sh
1.3 创建一个名为 test_env 的 conda 虚拟环境,虚拟环境中使用 python3.9
conda create -n test_env python=3.9
conda activate test_env   激活/进入环境
conda deactivate 退出环境

也可以添加镜像库,提高下载速度,本次不添加(因为添加后访问不了???未知原因)

创建虚拟环境后,后续会下载一些Python包。为防止下载速度慢,这里可以添加Python镜像源地址:

conda config --add channels https://pypi.tuna.tsinghua.edu.cn/simple

2.安装OPENLLM

https://github.com/bentoml/OpenLLM

2.1 本次为安装部署starcoder
 pip install "openllm[starcoder]" 
2.2 接受协议并在服务器上登录huggingface

在这里插入图片描述

huggingface-cli login
#然后会提示输入token,在huggingface的settings/tokens中设置,然后复制使用
2.3 启动starcoder

!!!注意:第一次启动会下载参数模型大概60多G,并且启动时会在占用根目录磁盘空间做临时缓存(预训练)启动后会释放,所以需保证安装位置和根目录空间充足。可以尝试

openllm start starcoder
2.4 停止服务

杀掉所有python进程,此方法为openllm作者提供,有点粗暴。。。

pgrep python | xargs kill -9
2.5 卸载conda 环境中安装的py和所有安装包
conda remove -n my_env --all
2.6 日志

bentoml默认输出控制台日志,不输出文件日志,需配置指定日志输出。(暂未找到输出配置的地方)

目前暂用标准输出重定向代替

二 模型调优

1.每次启动需要去huggingface加载config文件,此时需要梯子?尚未确定是否可本地配置
'(ReadTimeoutError("HTTPSConnectionPool(host='huggingface.co', port=443): Read timed out. (read timeout=10)"), '(Request ID: 185512b2-fbfc-476e-a48d-4d24ed4b80ae)')' thrown while requesting HEAD https://huggingface.co/bigcode/starcoder/resolve/main/config.json
2023-08-01T10:07:01+0800 [WARNING] [api_server:11] '(ReadTimeoutError("HTTPSConnectionPool(host='huggingface.co', port=443): Read timed out. (read timeout=10)"), '(Request ID: 185512b2-fbfc-476e-a48d-4d24ed4b80ae)')' thrown while requesting HEAD https://huggingface.co/bigcode/starcoder/resolve/main/config.json

2.GPU调试:–workers-per-resource
启动命令:
openllm start starcoder --workers-per-resource=1 --api-workers=2 --backlog=10

#指定GPU 参数  --device,下面指定的是7号GPU
openllm start starcoder --workers-per-resource=1 --api-workers=2 --backlog=10 --device=7

  • 单GPU:
    1. 单个GPU能性能拉满,90%以上;
    2. “max_new_tokens”: 96,能稳定控制3秒内得到推理结果;
  • 8GPU:
    1. 单GPU最高不超过10%,综合不超过70;
    2. 同单GPU一样,“max_new_tokens”: 96,能稳定控制3秒内得到推理结果;
    3. 经过与作者沟通,vllm可能会解决多GPU低利用率问题,但openllm暂未支持vllm,后续会上
3.模型大小:默认16

在这里插入图片描述

调整:8bit --quantize=int8

调整后,GPU内存占用降低,但负载上不去,观测最高40%,速度较16bit降低3倍左右

4.部署starcoder-base

openllm start starcoder --model-id=bigcode/starcoderbase --workers-per-resource=1 --api-workers=2 --backlog=10 --device=7

部署后相同参数,观测速度和starcoder并无差别

4.请求参数解析

https://blog.csdn.net/Komach/article/details/129086525

"llm_config": {
    "max_new_tokens": 96, //tokens越大推理效果越好,但是推理时间更长,96基本满足2秒以内
    "min_length": 0, //推理生成序列的最小长度,(输入长度+min_new_tokens)
    "min_new_tokens": 0, //推理最小序列tokens,设置后将覆盖min_length
    "use_beam_search": false, //使用beam_search,适用于生成序列:文本生成等,考虑词汇关联性,但是时间复杂度较高
    "early_stopping": true, // beam_search停止条件,达到num_beams数量的候选结果就停止
    "num_beams": 1, //beam_search中生成候选数量,越大推理效果越好,同时耗时更多
    "num_beam_groups": 1, //num_beams分组以保证多样性
    "use_cache": true, //使用缓存加速解码
    "temperature": 0.5, //用于调节下一个标记概率的值,越大随机性越大,
    "top_k": 50, //允许其他高分tokens有机会被选中。 这种采样引入的随机性有助于在很多情况下生成的质量。 top-k 参数设置为 3意味着选择前三个tokens。
将如果 k 和 p 都启用,则 p 在 k 之后起作用。
    "top_p": 0.95, //动态设置tokens候选列表的大小。 将可能性之和不超过特定值的top tokens列入候选名单。
Top p 通常设置为较高的值(如 0.75),目的是限制可能被采样的低概率 token 的长度。
    "typical_p": 1, //与 “top_p” 类似,但是它限制的是生成的文本中每个词概率的分布,而不是概率的确切值。与 “top_p” 不同的是,“typical_p” 可以产生更长的文本序列,因为它允许更多的词汇选择。
使用这些参数可以限制生成的文本,从而产生更有意义的,更符合目标的生成文本。
    "epsilon_cutoff": 0, //预测分布中删除词语的阈值,预测分布中低于这个阈值的将不会被选择
    "eta_cutoff": 0, //“eta_cutoff” 是 GPT-2 文本生成中的一个参数,它控制生成的序列的多样性。它的作用是决定是否要在符合预定要求的前提下生成更加出奇不意的序列。
eta_cutoff 表示当前生成的序列与最高概率的第二高概率的比值,如果比值大于 eta_cutoff,则继续生成下一个字符;如果比值小于 eta_cutoff,则停止生成。
通过调整 eta_cutoff 的值,可以控制生成的序列的多样性:如果 eta_cutoff 较低,则生成的序列会更加多样化;如果 eta_cutoff 较高,则生成的序列会更加保守,更接近训练数据。
    "diversity_penalty": 0, //diversity_penalty 参数是指对生成的文本多样性的惩罚因子。当 diversity_penalty 设置为正数时,
    它会惩罚生成的文本里排在前面的单词出现的频率过高的情况,进而提高文本的多样性。较小的 diversity_penalty 值可以使生成的文本更加保守,而较大的值则可以提高文本的创造性。
    需要注意的是,对文本多样性的惩罚因子过大也可能导致生成的文本质量下降,因此选择正确的 diversity_penalty 值需要根据具体应用场景和需求进行调整。
    "repetition_penalty": 1.2, //“repetition_penalty” 是用于文本生成中的参数,用于惩罚重复的单词和句子。
    默认值为1.0(starcoder默认1.2),其中较高的值意味着更强的惩罚,生成的文本中将出现更少的重复。如果取值为0,则没有惩罚,生成的文本可能包含大量重复的内容。
    "encoder_repetition_penalty": 1, //是Transformers库中用于文本生成任务的一个参数。
    它决定了对模型对源文本进行重复生成文本的惩罚程度。当设置了较高的值时,模型会对生成出来的文本与源文本重复的部分进行惩罚,从而有可能生成出不同于源文本的新文本。设置的值越大,模型对重复的文本的惩罚程度就越高。如果不设置此参数,则默认为1.0。
    "length_penalty": 1, //length_penalty是一个根据生成的序列长度动态调整生成序列的分数的因子。
    如果length_penalty的值较小,则长序列的分数会比较低,因此生成的序列可能较短。如果length_penalty的值较大,则长序列的分数可能更高,因此生成的序列可能更长。在适当的情况下,可以通过调整length_penalty的值来影响生成文本的长度。
    "no_repeat_ngram_size": 0, //参数指定了生成文本时需要避免的重复文本的大小。
    该参数指示在生成的文本中,最多允许多少个词与原始文本中的词进行重复。如果该值设置为 3,则生成的文本中的任何一段长度为三个词的子序列都不能与原始文本的任何子序列重复。设置该值可以防止生成的文本中出现重复词汇,因此可以提高生成文本的多样性。
    "renormalize_logits": false, //在 Text Generation 中,renormalize_logits 是一个控制标准化逻辑概率的布尔值。当设置为 True 时,它会将模型中的 logits 规范化为概率分布,以便于计算损失和生成样本。在某些情况下,如果 logits 不规范化,可能会出现训练困难或生成不稳定的问题,因此可以将 renormalize_logits 设置为 True 来解决这些问题。
需要注意的是,将 renormalize_logits 设置为 True 会对生成的样本产生一定的影响。具体来说,它会使生成的样本更加平滑,这意味着它们可能会失去一些原始模型的细节。因此,在某些情况下,可以将 renormalize_logits 设置为 False,以便生成更加准确和详细的样本。但是,这也可能导致训练问题和不稳定的生成结果,需要在使用时谨慎权衡。
    "remove_invalid_values": false, //在文本生成任务中,模型可能会生成一些无效的值,
    如NaN或Inf。如果这些无效值被允许出现,可能会导致模型出现错误或不可预测的结果。因此,如果在模型输出中检测到此类无效值,可以选择将其移除。在Transformers库中,可以使用remove_invalid_values参数来控制是否移除无效值。当remove_invalid_values设置为True时,任何无效值都会被移除。当设置为False时,这些无效值将保留在输出中。
    "num_return_sequences": 1, //用于控制模型生成的文本序列的数量。默认情况下,
    模型将生成一个完整的文本序列,但是你可以设置 num_return_sequences 参数为一个大于 1 的整数,以生成多个文本序列。这对于生成多个相关但不完全相同的文本序列很有用,例如为一组给定的提示或问题生成多个可能的答案。
    "output_attentions": false, //指定是否返回注意力矩阵
    "output_hidden_states": false, // 
    "output_scores": false, // 是否返回预测分数
    "pad_token_id": 49152,
    "encoder_no_repeat_ngram_size": 0,
    "n": 1,
    "presence_penalty": 0,//也是惩罚参数,小于0则鼓励模型使用重复tokens(是否出现)
    "frequency_penalty": 0,//也是惩罚参数,小于0则鼓励模型使用重复tokens(出现频率)
    "ignore_eos": false
  }
starcoder配置参数:以下为代码默认值
 generation_config = GenerationConfig(
        temperature=0.2,
        top_k=50,
        top_p=0.95,
        repetition_penalty=1.2,
        do_sample=true, //是指是否使用采样(sampling)方法来生成文本, bentoml不支持该参数,
        例如 temperature、top_p 等,这些参数会影响采样方法的结果
        pad_token_id=tokenizer.eos_token_id,
        eos_token_id=tokenizer.convert_tokens_to_ids(dialogue_template.end_token),
        min_new_tokens=32,
        max_new_tokens=256,
    )

5.我自己目前用的请求入参
目前调优参数值:
{
  "prompt": "String apiURL = settings.getApiURL();",
  "llm_config": {
    "max_new_tokens": 96, //96:基本稳定2.7秒左右;72:2秒左右;64:2秒内;32:1秒内
    "min_length": 0,
    "min_new_tokens": 0,
    "use_beam_search": false,
    "early_stopping": true,
    "num_beams": 1,
    "num_beam_groups": 1,
    "use_cache": true,
    "temperature": 0.5,
    "top_k": 50,
    "top_p": 0.95,
    "typical_p": 1,
    "epsilon_cutoff": 0,
    "eta_cutoff": 0,
    "diversity_penalty": 0,
    "repetition_penalty": 1.2,
    "encoder_repetition_penalty": 1,
    "length_penalty": 1,
    "no_repeat_ngram_size": 0,
    "renormalize_logits": false,
    "remove_invalid_values": false,
    "num_return_sequences": 1,
    "output_attentions": false,
    "output_hidden_states": false,
    "output_scores": false,
    "pad_token_id": 49152,
    "encoder_no_repeat_ngram_size": 0,
    "n": 1,
    "presence_penalty": 0,
    "frequency_penalty": 0,
    "ignore_eos": false
      }
}

6.vllm启动 (openllm v0.2.13)
OPENLLM_LLAMA_FRAMEWORK=vllm openllm start starcoder --workers-per-resource=0.125 --api-workers=2 --backlog=10
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值