├── README.md
├── component
├── argument.py
├── collator.py
├── dataset.py
├── loss.py
├── model.py
├── template.py
├── trainer.py
└── utils.py
├── data
├── dummy_data.jsonl
├── dummy_dpo.jsonl
└── pretrain
│ └── dummy_pretrain.jsonl
├── pics
├── demo.jpeg
├── firefly_logo.png
├── gongzhonghao.jpeg
├── gongzhonghao.png
├── len_distribution.png
├── task_distribution.png
├── train-loss-2b6-v2.png
├── train-loss-qlora.png
├── train-loss-ziya-13b.png
└── wechat-group.jpeg
├── requirements.txt
├── script
├── chat
│ └── chat.py
├── evaluate
│ └── evaluate.py
├── http
│ ├── post.py
│ └── start_service.py
└── merge_lora.py
├── train.py
└── train_args
├── dpo
├── full
│ ├── minicpm-2b-dpo-full.json
│ ├── minicpm3-4b-dpo-full.json
│ └── qwen1.5-7b-dpo-full.json
├── lora
│ ├── minicpm-2b-dpo-lora.json
│ ├── minicpm3-4b-dpo-lora.json
│ └── qwen1.5-7b-dpo-lora.json
└── qlora
│ ├── minicpm-2b-dpo-qlora.json
│ ├── minicpm3-4b-dpo-qlora.json
│ └── qwen1.5-7b-dpo-qlora.json
├── ds_z3_config.json
├── pretrain
├── full
│ ├── bloom-1b1-pretrain-full.json
│ ├── bloom-3b-pretrain-full.json
│ ├── minicpm3-4b-pretrain-full.json
│ └── qwen-7b-pretrain-full.json
└── qlora
│ ├── bloom-3b-pretrain-qlora.json
│ ├── minicpm3-4b-pretrain-qlora.json
│ ├── qwen-7b-pretrain-qlora.json
│ └── yi-6b-pretrain-qlora.json
└── sft
├── full
├── bloom-1b1-sft-full.json
├── bloom-3b-sft-full.json
├── minicpm-2b-sft-full.json
├── minicpm3-4b-sft-full.json
├── qwen-7b-sft-full.json
└── yi-6b-sft-full.json
├── lora
├── bloom-7b1-sft-lora.json
├── minicpm3-4b-sft-lora.json
└── qwen1.5-7b-sft-lora.json
└── qlora
├── baichuan-13b-sft-qlora.json
├── baichuan-7b-sft-qlora.json
├── baichuan2-13b-sft-qlora.json
├── baichuan2-7b-sft-qlora.json
├── bloom-7b1-sft-qlora.json
├── chatglm2-6b-sft-qlora.json
├── chatglm3-6b-sft-qlora.json
├── deepseek-7b-sft-qlora.json
├── deepseek-moe-16b-sft-qlora.json
├── gemma-2b-sft-qlora.json
├── gemma-7b-sft-qlora.json
├── internlm-20b-sft-qlora.json
├── internlm-7b-sft-qlora.json
├── internlm2-20b-sft-qlora.json
├── internlm2-7b-sft-qlora.json
├── llama2-13b-sft-qlora.json
├── llama2-7b-sft-qlora.json
├── llama3-8b-sft-qlora.json
├── minicpm-2b-sft-qlora.json
├── minicpm3-4b-sft-qlora.json
├── mistral-7b-sft-qlora.json
├── mixtral-8x7b-sft-qlora.json
├── orion-14b-sft-qlora.json
├── phi3-3.8b-sft-qlora.json
├── qwen-14b-sft-qlora.json
├── qwen-7b-sft-qlora.json
├── qwen1.5-7b-sft-qlora.json
├── qwen1.5-moe-2.7b-sft-qlora.json
├── qwen2-7b-sft-qlora.json
├── qwen2.5-7b-sft-qlora.json
├── vicuna-13b-sft-qlora.json
├── vicuna-7b-sft-qlora.json
├── xverse-13b-sft-qlora.json
├── xverse-7b-sft-qlora.json
├── yi-34b-sft-qlora.json
├── yi-6b-sft-qlora.json
├── yi1.5-6b-sft-qlora.json
├── zephyr-7b-sft-qlora.json
└── ziya2-13b-sft-qlora.json
/README.md:
--------------------------------------------------------------------------------
1 | # Firefly: 一站式大模型训练工具
2 |
3 |
4 |
5 | 
6 | [](./pics/wechat-group.jpeg)
7 | [](https://huggingface.co/YeungNLP)
8 |
9 | [//]: # ([](./pics/wechat.jpeg))
10 |
11 |
12 |
13 |
14 | 欢迎加入Firefly大模型技术交流群,关注我们的公众号,点击加群按钮即可。
15 |
16 |
17 |
18 | 欢迎关注我们的知乎进行交流讨论:**[红雨瓢泼](https://www.zhihu.com/people/jian-xin-15-96)**
19 |
20 | ## 项目简介
21 | **Firefly** 是一个开源的大模型训练项目,支持对主流的大模型进行预训练、指令微调和DPO,包括但不限于Qwen2、Yi-1.5、Llama3、Gemma、Qwen1.5、MiniCPM、MiniCPM3、Llama、InternLM、Baichuan、ChatGLM、Yi、Deepseek、Qwen、Orion、Ziya、Xverse、Mistral、Mixtral-8x7B、Zephyr、Vicuna、Bloom等。
22 | 本项目支持**全量参数训练、LoRA、QLoRA高效训练**,支持**预训练、SFT、DPO**。 如果你的训练资源有限,我们极力推荐使用QLoRA进行指令微调,因为我们在Open LLM Leaderboard上验证了该方法的有效性,并且取得了非常不错的成绩。
23 |
24 | 🔔 本项目主要内容如下:
25 | - 📗 支持预训练、指令微调、DPO,支持全量参数训练、LoRA、QLoRA高效训练。通过配置文件的方式训练不同的模型,小白亦可快速上手训练模型。
26 | - 📗 支持使用[Unsloth](https://github.com/yangjianxin1/unsloth)加速训练,并且节省显存。
27 | - 📗 支持绝大部分主流的开源大模型,如Llama3、Gemma、MiniCPM、Llama、InternLM、Baichuan、ChatGLM、Yi、Deepseek、Qwen、Orion、Ziya、Xverse、Mistral、Mixtral-8x7B、Zephyr、Vicuna、Bloom,训练时与各个官方的chat模型的template对齐。
28 | - 📗 整理并开源指令微调数据集:firefly-train-1.1M 、moss-003-sft-data、ultrachat、 WizardLM_evol_instruct_V2_143k、school_math_0.25M。
29 | - 📗 开源[Firefly系列指令微调模型权重](https://huggingface.co/YeungNLP) 。
30 | - 📗 在Open LLM Leaderboard上验证了QLoRA训练流程的有效性。
31 |
32 | 当前版本针对不同的chat模型的template进行了适配,代码存在较大的更新。若你更喜欢此前的版本,可下载代码[v0.0.1-alpha](https://github.com/yangjianxin1/Firefly/releases/tag/v0.0.1-alpha)
33 |
34 | ## News
35 | - 🔥 Unsloth x Qwen2模型结构的PR已merge到[Unsloth](https://github.com/unslothai/unsloth)的master分支。
36 | - 🔥 扩展Unsloth,支持Qwen2模型结构,包括Qwen1.5系列的Dense模型,代码库:[Unsloth](https://github.com/yangjianxin1/unsloth)。 [技术文章](https://mp.weixin.qq.com/s/x2N3p1qgJy_RyRsO2PHS_A)
37 | - 🔥 支持[Unsloth](https://github.com/unslothai/unsloth),训练Llama3-8B仅需7.75GB显存,可减少42.58%显存占用,减少30.72%训练时间。 [训练增益评测](https://mp.weixin.qq.com/s/Zlp7GM37_bkvvQZedzNp0g)。
38 | - 🔥 优化训练流程,支持全量训练、LoRA、QLoRA高效训练,支持预训练、指令微调和DPO。指令微调与DPO的template与原有的chat模型对齐,支持绝大多数开源模型,包括Gemma、MiniCPM、Llama、InternLM、Baichuan、ChatGLM、Yi、Deepseek、Qwen、Orion、Ziya、Xverse、Mistral、Mixtral-8x7B、Zephyr、Vicuna、Bloom等。
39 | - 🔥 开源模型权重[firefly-mixtral-8x7b](https://huggingface.co/YeungNLP/firefly-mixtral-8x7b) ,在[🤗Open LLM排行榜](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)分数为70.34,超越Yi-34B、Llama2-65B-Chat、Qwen-14B、Vicuna-33B-v1.3等模型。
40 | - 🔥 开源[LongQLoRA](https://github.com/yangjianxin1/LongQLoRA), 【[技术报告](https://arxiv.org/abs/2311.04879)】。可高效扩展LLama上下文长度,在单张32GB V100上将Llama2长度扩展至8k(亦可扩展至12k),仅微调1000 step,在PG19和Proof-pile数据集上的perplexity优于LongLoRA,在PG19上略胜MPT-7B-8K。
41 | - 🔥 开源[Firefly-LLaMA2-Chinese项目](https://github.com/yangjianxin1/Firefly-LLaMA2-Chinese),**在4*V100上进行高效训练**,经过中文词表扩充、增量预训练、多轮指令微调,在CMMLU上超越Linly、Yayi、FlagAlpha等,与Ziya、Chinese-Alpaca表现基本持平。
42 | - 🔥 开源[firefly-baichuan2-13b](https://huggingface.co/YeungNLP/firefly-baichuan2-13b),在OpenCompass的CMMLU榜单上以56.83的分数,位列第8,比百川官方Chat模型略低1.57分。
43 | - 🔥 开源[firefly-llama-30b](https://huggingface.co/YeungNLP/firefly-llama-30b),在[🤗Open LLM排行榜](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)上以64.83分,同量级模型**排名第10**。
44 | - 🔥 开源[firefly-llama2-13b](https://huggingface.co/YeungNLP/firefly-llama2-13b),在[🤗Open LLM排行榜](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)上以62分,同量级模型**排名第3**,比榜首略低0.5分。
45 | - 🔥 开源[firefly-llama-13b](https://huggingface.co/YeungNLP/firefly-llama-13b),在[Hugging Face的Open LLM排行榜](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)上复刻Vicuna-13B,比Vicuna-13b-1.1略高0.2分,比llams-2-13b-chat略低0.5分。
46 | - [LLMPruner:大语言模型裁剪工具](https://github.com/yangjianxin1/LLMPruner) ,开源[裁剪后的Bloom模型权重](https://huggingface.co/YeungNLP) 。
47 |
48 | ## 相关项目
49 | - [Firefly-LLaMA2-Chinese](https://github.com/yangjianxin1/Firefly-LLaMA2-Chinese):中文Llama2模型,对Llama2进行中文词表扩充、增量预训练和指令微调。
50 | - [LongQLoRA](https://github.com/yangjianxin1/LongQLoRA):大模型长度扩展项目,可在单卡V100上将LLaMA-13B的长度扩展至8192,且性能逼近MPT-8K。
51 | - [LLMPruner](https://github.com/yangjianxin1/LLMPruner):对Bloom进行词表裁剪,减少模型参数量。
52 |
53 | ## 技术博客
54 | 技术博客
55 |
56 | - [Unsloth x Qwen2,提速47.32%,节省39.13%显存,最少仅需8.43GB显存](https://mp.weixin.qq.com/s/x2N3p1qgJy_RyRsO2PHS_A)
57 | - [Unsloth微调Llama3-8B,提速44.35%,节省42.58%显存,最少仅需7.75GB显存](https://mp.weixin.qq.com/s/Zlp7GM37_bkvvQZedzNp0g)
58 | - [弱智吧祛魅,与强Baseline的对比实验,差距明显](https://mp.weixin.qq.com/s/LwGgMbPdC_UTCefqWSkXEQ)
59 | - [关于弱智吧数据封神的若干疑问和猜想,以及数据验证实验](https://mp.weixin.qq.com/s/PnJVA66QLp4-gZTss46PqQ)
60 | - [图解大模型推理优化之KV Cache](https://mp.weixin.qq.com/s/7Fm8LbUN9jQ2HqxPbUU7UQ)
61 | - [Mixtral-8x7B MoE大模型微调实践,超越Llama2-65B](https://mp.weixin.qq.com/s/f24e-Tp-1WyXTbVOzePvhg)
62 | - [LongQLoRA:单卡高效扩展LLaMA2-13B的上下文长度](https://mp.weixin.qq.com/s/lptWXi9sZXd2MTTXZsDiPw)
63 | - [详解基于调整RoPE旋转角度的大模型长度外推方法](https://mp.weixin.qq.com/s/RtI95hu-ZLxGkdGuNIkERQ)
64 | - [图解RoPE旋转位置编码及其特性](https://mp.weixin.qq.com/s/-1xVXjoM0imXMC7DKqo-Gw)
65 | - [QLoRA轻量级增量预训练方案,及汉化Llama2的实践](https://mp.weixin.qq.com/s/26-Qxma9M2wGoTQgOlKRmQ)
66 | - [Firefly多轮对话微调书生·浦语InternLM-7B实践](https://mp.weixin.qq.com/s/98OLdkHjoGDHNDbYL7RerA)
67 | - [🤗Firefly微调LLaMA-30B,Open LLM榜单同量级第10名](https://mp.weixin.qq.com/s/fFT0Pxfecma4n_fXQYb2Mw)
68 | - [通义千问Qwen-7B效果如何?Firefly微调实践,效果出色](https://mp.weixin.qq.com/s/5OAx83j6Op299XAfa496ww)
69 | - [源码解析ChatGLM2多轮对话训练方法的不足,以及改进方法](https://mp.weixin.qq.com/s/nhogoWnzl3nrs_77r38_UA)
70 | - [Firefly增强Baichuan-13B的多轮对话能力](https://mp.weixin.qq.com/s/djO8Tg3emmy6wzw_rTUlcw)
71 | - [🤗Open LLM排行榜,firefly-llama2-13b在所有13B模型中排名第三,比榜首略低0.5分](https://mp.weixin.qq.com/s/w1V3QGvsRTQsQqAKp2z6Kg)
72 | - [百万数据增强Baichuan-13B的多轮对话能力](https://mp.weixin.qq.com/s/djO8Tg3emmy6wzw_rTUlcw)
73 | - [Firefly单卡复刻Vicuna-13B,Open LLM榜单🤗略高0.2分](https://mp.weixin.qq.com/s/QG2YMo_QxaxS_Rr2yJrIeA)
74 | - [微调百川Baichuan-13B保姆式教程,手把手教你训练百亿大模型](https://mp.weixin.qq.com/s/ZBY6kbogHjbCQvZBzNEqag)
75 | - [Firefly-Ziya-13B开源,QLoRA+百万数据,单卡可训百亿大模型](https://mp.weixin.qq.com/s/vgNK6D-_0j4Chk2H1Ev-Ig)
76 | - [Firefly|百川baichuan-7B实测,QLoRA+百万指令数据微调](https://mp.weixin.qq.com/s/_eTkDGG5DmxyWeiQ6DIxBw)
77 | - [Firefly | QLoRA+百万数据,多卡高效微调bloom-7b1模型](https://mp.weixin.qq.com/s/lA4YUJ9XGpKlUUUjz0Le-g)
78 | - [QLoRA文章解读 & 单卡高效微调bloom-7b1](https://mp.weixin.qq.com/s/DED7yeiE0DibsVzTmMeDOw)
79 | - [Firefly(流萤): 中文对话式大语言模型](https://mp.weixin.qq.com/s/TX7wj8IzD_EaMTvk0bjRtA)
80 | - [LLMPruner:大语言模型裁剪工具](https://mp.weixin.qq.com/s/leVtrwZc1zLput51Nr99lw)
81 |
82 |
83 |
84 |
85 | ## 模型评测
86 |
87 | ### Open LLM Leaderboard评测
88 | 评测结果来源于Hugging Face的[Open LLM Leaderboard](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)。我们的模型均采用QLoRA脚本进行训练,训练仅使用1~2张V100。
89 |
90 |
91 | | 模型 | Average | ARC | HellaSwag | MMLU | TruthfulQA |
92 | |-----------------------------|---------|-------|-----------|-------|------------|
93 | | **firefly-mixtral-8x7b** | 70.16 | 68.09 | 85.76 | 71.49 | 55.31 |
94 | | Yi-34B-Chat | 69.97 | 65.44 | 84.16 | 74.9 | 55.37 |
95 | | **firefly-llama-30b** | 64.83 | 64.25 | 83.64 | 58.23 | 53.2 |
96 | | falcon-40b-instruct | 63.47 | 61.6 | 84.31 | 55.45 | 52.52 |
97 | | guanaco-33b | 62.98 | 62.46 | 84.48 | 53.78 | 51.22 |
98 | | **firefly-llama2-13b-v1.2** | 62.17 | 60.67 | 80.46 | 56.51 | 51.03 |
99 | | **firefly-llama2-13b** | 62.04 | 59.13 | 81.99 | 55.49 | 51.57 |
100 | | vicuna-13b-v1.5 | 61.63 | 56.57 | 81.24 | 56.67 | 51.51 |
101 | | mpt-30b-chat | 61.21 | 58.7 | 82.54 | 51.16 | 52.42 |
102 | | wizardlm-13b-v1.2 | 60.79 | 59.04 | 82.21 | 54.64 | 47.27 |
103 | | vicuna-13b-v1.3 | 60.01 | 54.61 | 80.41 | 52.88 | 52.14 |
104 | | llama-2-13b-chat | 59.93 | 59.04 | 81.94 | 54.64 | 44.12 |
105 | | vicuna-13b-v1.1 | 59.21 | 52.73 | 80.14 | 51.9 | 52.08 |
106 | | guanaco-13b | 59.18 | 57.85 | 83.84 | 48.28 | 46.73 |
107 |
108 |
109 | ## 模型列表
110 |
111 | 🔔 使用本项目的训练代码,以及上述训练数据,我们训练并开源了以下模型权重。
112 |
113 | 中文模型:
114 |
115 | | 模型 | 基座模型 | 训练长度 |
116 | |--------------------------------------------------------------------------------|-------------------------------------|------|
117 | | [firefly-baichuan2-13b](https://huggingface.co/YeungNLP/firefly-baichuan2-13b) | baichuan-inc/Baichuan2-13B-Base | 1024 |
118 | | [firefly-baichuan-13b](https://huggingface.co/YeungNLP/firefly-baichuan-13b) | baichuan-inc/Baichuan-13B-Base | 1024 |
119 | | [firefly-qwen-7b](https://huggingface.co/YeungNLP/firefly-qwen-7b) | Qwen/Qwen-7B | 1024 |
120 | | [firefly-chatglm2-6b](https://huggingface.co/YeungNLP/firefly-chatglm2-6b) | THUDM/chatglm2-6b | 1024 |
121 | | [firefly-internlm-7b](https://huggingface.co/YeungNLP/firefly-internlm-7b) | internlm/internlm-7b | 1024 |
122 | | [firefly-baichuan-7b](https://huggingface.co/YeungNLP/firefly-baichuan-7b) | baichuan-inc/baichuan-7B | 1024 |
123 | | [firefly-ziya-13b](https://huggingface.co/YeungNLP/firefly-ziya-13b) | YeungNLP/Ziya-LLaMA-13B-Pretrain-v1 | 1024 |
124 | | [firefly-bloom-7b1](https://huggingface.co/YeungNLP/firefly-bloom-7b1) | bigscience/bloom-7b1 | 1024 |
125 | | [firefly-bloom-2b6-v2](https://huggingface.co/YeungNLP/firefly-bloom-2b6-v2) | YeungNLP/bloom-2b6-zh | 512 |
126 | | [firefly-bloom-2b6](https://huggingface.co/YeungNLP/firefly-bloom-2b6) | YeungNLP/bloom-2b6-zh | 512 |
127 | | [firefly-bloom-1b4](https://huggingface.co/YeungNLP/firefly-bloom-1b4) | YeungNLP/bloom-1b4-zh | 512 |
128 |
129 |
130 | 英文模型:
131 |
132 | | 模型 | 基座模型 | 训练长度 |
133 | |------------------------------------------------------------------------|-------------------|------|
134 | | [firefly-mixtral-8x7b](https://huggingface.co/YeungNLP/firefly-mixtral-8x7b) | mistralai/Mixtral-8x7B-v0.1 | 1024 |
135 | | [firefly-llama-30b](https://huggingface.co/YeungNLP/firefly-llama-30b) | huggyllama/llama-30b | 1024 |
136 | | [firefly-llama-13-v1.2](https://huggingface.co/YeungNLP/firefly-llama2-13b-v1.2) | NousResearch/Llama-2-13b-hf | 1024 |
137 | | [firefly-llama2-13b](https://huggingface.co/YeungNLP/firefly-llama2-13b) | NousResearch/Llama-2-13b-hf | 1024 |
138 | | [firefly-llama-13b-v1.2](https://huggingface.co/YeungNLP/firefly-llama-13b-v1.2) | huggyllama/llama-13b | 1024 |
139 | | [firefly-llama-13b](https://huggingface.co/YeungNLP/firefly-llama-13b) | huggyllama/llama-13b | 1024 |
140 |
141 |
142 |
143 | ## 训练数据
144 | ### 指令微调数据
145 | 🔔 目前本项目主要整理了如下指令数据集,并将其整理成统一的数据格式:
146 |
147 | | 数据集 | 介绍 |
148 | |--------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------|
149 | | [firefly-train-1.1M](https://huggingface.co/datasets/YeungNLP/firefly-train-1.1M) | 我们收集了23种常见的中文NLP任务的数据,并且构造了许多与中华文化相关的数据,如对联、作诗、文言文翻译、散文、金庸小说等。对于每个任务,由人工书写若干种指令模板,保证数据的高质量与丰富度,数据量为115万 |
150 | | [moss-003-sft-data](https://huggingface.co/datasets/YeungNLP/moss-003-sft-data) | 由复旦大学MOSS团队开源的中英文多轮对话数据,包含100万+数据 |
151 | | [ultrachat](https://huggingface.co/datasets/YeungNLP/ultrachat) | 由清华大学开源的英文多轮对话数据,包含140万+数据 |
152 | | [WizardLM_evol_instruct_V2_143k](https://huggingface.co/datasets/YeungNLP/WizardLM_evol_instruct_V2_143k) | 由WizardLM项目开源的英文指令微调数据集,通过Evol-Instruct方法让指令进化,加强指令的复杂度,以提升模型对复杂指令的遵循能力。包含143k条数据。 |
153 | | [school_math_0.25M](https://huggingface.co/datasets/YeungNLP/school_math_0.25M) | 由BELLE项目组开源的数学运算指令数据,包含25万条数据。 |
154 | | [shareAI/CodeChat](https://huggingface.co/datasets/shareAI/CodeChat) | 主要包含逻辑推理、代码问答、代码生成相关语料样本。 |
155 | | [shareAI/ShareGPT-Chinese-English-90k](https://huggingface.co/datasets/shareAI/ShareGPT-Chinese-English-90k) | 中英文平行双语优质人机问答数据集,覆盖真实复杂场景下的用户提问。 |
156 | | [ultrachat_200k](https://huggingface.co/datasets/YeungNLP/ultrachat_200k) | 由Zephyr项目开源的英文指令微调数据,在ultrachat数据基础上进行清洗 |
157 | | [ultrafeedback_binarized](https://huggingface.co/datasets/YeungNLP/ultrafeedback_binarized) | 英文偏好数据集,可用于DPO训练 |
158 |
159 |
160 | 可按需选择、采样或组合上述数据。若是训练中文模型,建议尝试使用moss数据,英文可尝试ultrachat和WizardLM数据。
161 |
162 | 训练数据为jsonl格式,每一行的数据格式如下,其中conversation字段是必需的,可以根据实际需求添加或删除其他字段。
163 | 可以参考项目中的data/dummy_data.jsonl文件。
164 | ```json
165 | {
166 | "conversation_id":44,
167 | "category":"Brainstorming",
168 | "conversation":[
169 | {
170 | "human":"怎么能够有效地提升个人能力?",
171 | "assistant":"提升个人能力可以通过以下几个方面实现:\n\n1. 学习新知识和技能:阅读相关书籍、参加课程和工作坊、观看教育视频等学习方式,可以帮助你掌握新的知识和技能,从而提升个人能力。\n\n2. 持续练习和实践:不断地练习和实践所学的知识和技能,可以帮助你更好地掌握和应用这些技能,提高你的表现和效率。\n\n3. 寻求反馈和改进:寻求他人的反馈和建议可以帮助你发现自己的不足之处,进一步完善和改进自己的能力。\n\n4. 建立良好的工作和生活习惯:建立良好的工作和生活习惯,如合理安排时间、注意健康、保持积极态度等,可以提高你的工作效率和生活品质,从而提升个人能力。\n\n5. 社交和交流:与他人交流和合作,可以帮助你更好地了解他人的观点和经验,从而提升自己的能力和见识。"
172 | },
173 | {
174 | "human":"对于初学者来说,如何快速掌握编程技能?",
175 | "assistant":"以下是几个建议,可以帮助初学者快速掌握编程技能:\n\n1. 学习基础知识:建议先学习编程语言的基础知识和语法,例如变量、数据类型、控制结构、函数等。可以通过在线课程、编程书籍、视频教程等方式学习。\n\n2. 实践编程:进行实际的编程练习是非常重要的,可以通过参加编程挑战、编写小项目等方式来进行实践。\n\n3. 寻求反馈:可以寻求他人的反馈和建议,例如在线编程社区、编程导师等,他们可以帮助你发现问题并及时纠正。\n\n4. 阅读优秀代码:阅读和分析优秀的代码可以帮助你学习其他程序员的编程思路和技巧,从而提高自己的编程能力。\n\n5. 不断学习和更新:编程技术和工具在不断更新和发展,因此需要不断学习新的知识和技能,例如学习新的编程语言、框架、工具等,以跟上技术的发展和变化。\n\n总之,学习编程需要耐心和坚持,并且需要不断地实践和学习。通过以上建议,可以帮助初学者快速掌握编程技能。"
176 | },
177 | {
178 | "human":"除了参加编程挑战和阅读代码,还有哪些方式可以提升自己的编程能力呢?",
179 | "assistant":"除了参加编程挑战和阅读代码,还有以下几种方式可以提升自己的编程能力:\n\n1. 参与开源项目:加入一个开源项目,可以让你了解到实际的软件开发流程和团队合作方式,并且可以与其他开发人员合作,学习和分享编程技巧和经验。\n\n2. 进行代码重构:对已经编写的代码进行重构,可以帮助你了解更好的编程实践和设计模式,从而提高代码的可读性和可维护性。\n\n3. 练习算法和数据结构:算法和数据结构是编程中的重要基础,练习算法和数据结构可以帮助你了解不同的数据结构和算法,从而更好地解决实际问题。\n\n4. 学习软件工程和架构:学习软件工程和架构的知识,可以帮助你了解如何设计和构建可靠、可扩展和可维护的软件系统。\n\n5. 参加编程社区和论坛:参加编程社区和论坛可以让你与其他开发人员分享和讨论编程经验和技巧,了解最新的技术趋势和解决方案。\n\n总之,提升编程能力需要不断地学习和实践,并与其他开发人员和编程专家进行交流和合作,以获取更多的经验和知识。"
180 | },
181 | {
182 | "human":"你有没有推荐的编程挑战网站?",
183 | "assistant":"当然,以下是一些值得推荐的编程挑战网站:\n\n1. HackerRank:HackerRank 是一个全球领先的技术招聘平台,提供数百种编程挑战和比赛,包括算法、数据结构、数学、SQL、AI 等多个技术领域。\n\n2. LeetCode:LeetCode 是一个在线编程学习和实践平台,提供数千道编程题目,主要涵盖算法和数据结构。\n\n3. Codeforces:Codeforces 是一个全球知名的编程竞赛网站,提供数百个比赛和练习题目,主要涵盖算法和数据结构。\n\n4. Codewars:Codewars 是一个在线编程学习和实践平台,提供数千道编程题目,主要涵盖算法、数据结构、面向对象编程等多个技术领域。\n\n5. Project Euler:Project Euler 是一个非营利性的在线编程挑战平台,提供一系列数学和计算机科学问题,需要用编程语言进行解答。\n\n以上这些编程挑战网站可以帮助你提高编程能力,并且可以与其他编程爱好者进行交流和竞争。"
184 | },
185 | {
186 | "human":"在学习编程的过程中,如何避免陷入困境和放弃呢?",
187 | "assistant":"学习编程是一个需要长期坚持和不断学习的过程,以下是一些避免陷入困境和放弃的方法:\n\n1. 制定合理的学习计划:制定合理的学习计划,包括学习时间、学习内容、目标等,可以帮助你更好地管理时间和精力,避免学习过程中的松懈和分心。\n\n2. 寻找合适的学习资源:选择适合自己的学习资源,例如在线课程、编程书籍、视频教程等,可以让你更好地了解和掌握编程知识和技能。\n\n3. 寻求帮助和支持:在学习过程中,遇到问题和困难是很正常的,可以寻求他人的帮助和支持,例如参加编程社区、找到编程导师等。\n\n4. 进行实践和项目:实践和项目是学习编程的重要组成部分,可以帮助你更好地了解和掌握编程技能,同时也可以提高学习的兴趣和动力。\n\n5. 坚持并保持兴趣:坚持学习和保持兴趣是学习编程的关键。可以通过参加编程社区、参加编程竞赛、与其他编程爱好者交流等方式来保持兴趣和动力。\n\n总之,学习编程需要耐心和坚持,并需要不断学习和实践。通过以上方法可以帮助你避免陷入困境和放弃。"
188 | }
189 | ],
190 | }
191 | ```
192 |
193 | 其中firefly-train-1.1M的数据分布如下图所示:
194 |
195 |
196 |
197 | ### 预训练数据
198 | 数据格式可以参考项目中的data/pretrain/dummy_pretrain.jsonl文件。
199 |
200 | ### DPO数据
201 | 数据格式可以参考项目中的data/dummy_dpo.jsonl文件。
202 |
203 | ## 模型训练
204 | 若训练中报错,可先查看[FAQ]()。
205 |
206 | 我们将训练中使用的各种组件抽取出来,以便后续的扩展和优化,详见component目录下的实现。训练时的参数配置存储在train_args目录下,方便统一管理和更改。大家可以在train_args目录下查看不同模型的训练配置,按需修改或添加。
207 |
208 | ### 安装环境
209 | 在requirements.txt下固定了几个主要的python包的版本,执行如下脚本即可。注意:
210 | - 对于绝大部分模型,我们均在torch==1.13,transformers==4.36环境上进行调试和训练。但部分较新的模型,需要更新transformers版本。
211 | - Qwen1.5需要将transformers更新只4.37。
212 | - Gemma需要将transformers更新只4.38.1,torch==2.0.0。
213 | - 使用QLoRA训练Baichuan2时,需要安装torch==2.0,并且卸载xformers和apex。
214 | - 使用QLoRA训练Qwen时,需将flash-attn卸载,否则会报错。
215 | ```bash
216 | pip install requirements.txt
217 | ```
218 |
219 | 如果需要开启Unsloth,建议安装或者更新以下Python包:
220 | ```bash
221 | pip install git+https://github.com/unslothai/unsloth.git
222 | pip install bitsandbytes==0.43.1
223 | pip install peft==0.10.0
224 | pip install torch==2.2.2
225 | pip install xformers==0.0.25.post1
226 | ```
227 |
228 | 如果需要使用Unsloth对Qwen1.5进行训练,安装如下包:
229 | ```bash
230 | pip install git+https://github.com/yangjianxin1/unsloth.git
231 | ```
232 |
233 | ### 损失函数
234 | 预训练时,我们采用经典的自回归损失,即每个位置的token都会参与loss计算。
235 |
236 | 指令微调时,我们仅计算assistant回复部分的loss。
237 |
238 | ### 参数说明
239 | 📝 train_args目录下存储了不同模型使用不同训练方式的配置文件,主要参数说明如下:
240 | - output_dir:训练输出目录,存储checkpoint、tokenizer、tensorboard等
241 | - model_name_or_path:预训练模型的本地目录,或者在huggingface上的模型名称。
242 | - train_file:训练数据集路径。sft时,需要设置为文件,可以使用data/dummy_data.jsonl进行debug。pretrain时,需要设置为目录。脚本会自动扫描目录下的所有jsonl文件。
243 | - template_name:指令微调时,使用的模板名称。具体有哪些template_name,可参考component/template.py文件
244 | - num_train_epochs:训练的轮次。如果数据量足够大,一般建议只训一个epoch。
245 | - tokenize_num_workers:预训练时,tokenize的线程数,默认为10。
246 | - deepspeed:deepspeed的训练配置文件。全量参数训练时,将采用deepspeed,关于deepspeed的参数配置说明,请参考[deepspeed文档](https://hf-mirror.com/docs/transformers/main/en/deepspeed#deepspeed)
247 | - train_mode:训练模式,full、lora或qlora,默认为qlora。
248 | - task_type:任务类型,pretrain、sft或dpo,默认为sft。
249 | - per_device_train_batch_size:每张显卡的batch size。
250 | - gradient_accumulation_steps:梯度累计步数。global batch=num_gpus * per_device_train_batch_size * gradient_accumulation_steps。
251 | - gradient_checkpointing:如果显存捉襟见肘,可以开启。以时间换空间,模型不缓存激活状态,会进行两次forward计算,以节省显存。
252 | - learning_rate:学习率。全量参数微调的时候,建议小一些,1e-5或5e-6。
253 | - max_seq_length:训练时的最大长度。按照自己的设备进行设置,越长需要占用越多显存。
254 | - max_prompt_length:进行dpo时,prompt的最大长度。
255 | - logging_steps:每隔多少步统计一次train loss。
256 | - save_steps:每隔多少步保存一个模型。
257 | - save_total_limit:output_dir目录中最多保存多少个checkpoint,超出则会将最旧的删除。
258 | - lr_scheduler_type:学习率变化策略。
259 | - warmup_steps:warm up步数。学习率经过多少步,增长到指定的数值。
260 | - optim:优化器。如果是全量参数微调,建议使用adamw_hf。
261 | - seed:随机种子,用于复现实验结果。
262 | - fp16:使用使用fp16混合精度。V100建议开启。
263 | - bf16:使用使用bf16混合精度。A100建议开启。
264 | - use_unsloth:是否使用unsloth,目前unsloth仅支持部分模型,例如Llama3、Mistral、Gemma、TinyLlama等,详情见[Unsloth](https://github.com/unslothai/unsloth)。
265 |
266 | 以下几个参数,当使用QLoRA训练的时候,需要设置:
267 | - lora_rank:qlora矩阵的秩。一般设置为8、16、32、64等,在qlora论文中作者设为64。越大则参与训练的参数量越大,一般来说效果会更好,但需要更多显存,。
268 | - lora_alpha: qlora中的缩放参数。一般设为16、32即可。
269 | - lora_dropout: lora权重的dropout rate。
270 |
271 | 关于deepspeed的参数配置,可按需自行修改。
272 |
273 |
274 | ### 开始训练
275 |
276 | 💻 全量参数预训练,将{num_gpus}替换为显卡数量:
277 | ```bash
278 | deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/pretrain/full/bloom-1b1-pretrain-full.json
279 | ```
280 |
281 | 💻 全量参数指令微调,将{num_gpus}替换为显卡数量:
282 | ```bash
283 | deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/sft/full/bloom-1b1-sft-full.json
284 | ```
285 |
286 | 💻 单卡QLoRA预训练:
287 | ```bash
288 | python train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
289 | ```
290 |
291 | 💻 单卡QLoRA指令微调:
292 | ```bash
293 | python train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
294 | ```
295 |
296 | 💻 多卡QLoRA预训练:
297 | ```bash
298 | torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
299 | ```
300 |
301 | 💻 多卡QLoRA指令微调:
302 | ```bash
303 | torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
304 | ```
305 |
306 | 💻 单卡QLoRA进行DPO训练:
307 | ```bash
308 | python train.py --train_args_file train_args/sft/qlora/minicpm-2b-dpo-qlora.json
309 | ```
310 |
311 | ## 模型使用
312 |
313 | ### 权重合并
314 | 如果使用LoRA或者QLoRA进行训练,本项目仅保存adapter的权重和配置文件,需要将adapter权重与base model进行合并。脚本见script/merge_lora.py
315 |
316 | ### 模型推理
317 | 我们提供了多轮对话的交互脚本,详见script/chat目录,该脚本可同时兼容本项目训练的所有模型进行推理。脚本中设置的template_name,需要与模型训练时的template_name一致。
318 | ```bash
319 | cd script/chat
320 | python chat.py
321 | ```
322 |
323 | 生成脚本中的top_p、temperature、repetition_penalty、do_sample等参数对模型的生成效果影响较大,可按照自己的使用场景进行调试修改。
324 |
325 | 推理脚本中支持使用base model和adapter进行推理,缺点是每次启动脚本都需要合并一次权重,等待时间较久。
326 |
327 | 支持使用4bit进行推理,显存要求低,效果会略有下降。
328 |
329 |
330 | ## FAQ
331 | #### 问题1:OOM如何解决?
332 | 如果发生OOM,可以缩小per_device_train_batch_size、max_seq_length等参数来缓解。也可以设gradient_checkpointing=true,可以大幅降低显存占用,但训练速度会变慢一些。
333 |
334 | #### 问题2:安装包错误
335 | requirements.txt中有各python包的版本
336 | ```bash
337 | pip install -r requirements.txt
338 | ```
339 |
340 | #### 问题3:如何指定使用某些卡训练?
341 | 通过如下方式,即可指定使用0和1号卡进行训练:
342 | ```bash
343 | CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node={num_gpus} train_qlora.py --train_args_file train_args/qlora/baichuan-7b-sft-qlora.json
344 | ```
345 |
346 | #### 问题4:训练Baichuan2失败
347 | 训练Baichuan2需要安装torch==2.0,并且卸载xformers和apex,否则会报错
348 | ```
349 | RuntimeError: No such operator xformers::efficient_attention_forward_generic - did you forget to build xformers with `python setup.py develop`?
350 | ```
351 |
352 | #### 问题5:训练Qwen失败
353 | Qwen进行QLoRA训练需要卸载flash-attn,否则会报错:
354 | ```
355 | assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v)))
356 | ```
357 |
358 | #### 问题6:Qwen-Base和Yi-Base经过SFT之后,没法生成<|im_end|>,无法正常停止
359 | 经查询,该问题广泛存在于Qwen官方代码库的issue中,如果训练Qwen-Base和Yi-Base,建议设template_name="default",可以避免该问题。
360 | 如果对Qwen-Chat和Yi-Chat模型进行SFT,则不会产生该问题,可将template_name分别设为"qwen"和"yi"。
361 |
362 | 注意:该问题在Qwen1.5中不存在
363 |
364 |
365 | ## 局限性和使用限制
366 | 由于模型参数量限制、训练数据的清洗程度等因素,本项目开源的模型可能存在以下局限性:
367 | - 对于事实性知识,容易产生错误的回复。
368 | - 由于未经过无害化微调,可能会产生歧视、危害、违背伦理道德的言论。
369 | - 在代码、推理上的能力仍有欠缺。
370 |
371 | 基于以上模型的局限性,我们要求本项目的代码、数据、模型不得用于对社会造成危害的用途,且应当遵循基座模型的商业许可。
372 |
373 | ## 引用
374 | 若使用本项目的数据、代码或模型,请引用本项目。
375 | ```text
376 | @misc{Firefly,
377 | author = {Jianxin Yang},
378 | title = {Firefly(流萤): 中文对话式大语言模型},
379 | year = {2023},
380 | publisher = {GitHub},
381 | journal = {GitHub repository},
382 | howpublished = {\url{https://github.com/yangjianxin1/Firefly}},
383 | }
384 | ```
385 |
386 | [//]: # (## 关注我们)
387 |
388 | [//]: # ()
389 | [//]: # (
)
390 |
391 | ## Star History
392 | 
393 |
394 |
395 |
396 |
397 |
--------------------------------------------------------------------------------
/component/argument.py:
--------------------------------------------------------------------------------
1 | from dataclasses import dataclass, field
2 | from typing import Optional
3 |
4 |
5 | @dataclass
6 | class CustomizedArguments:
7 | """
8 | 一些自定义参数
9 | """
10 | max_seq_length: int = field(metadata={"help": "输入最大长度"})
11 | train_file: str = field(metadata={"help": "训练集。如果task_type=pretrain,请指定文件夹,将扫描其下面的所有jsonl文件"})
12 | model_name_or_path: str = field(metadata={"help": "预训练权重路径"})
13 | template_name: str = field(default="", metadata={"help": "sft时的数据格式"})
14 | eval_file: Optional[str] = field(default="", metadata={"help": "验证集"})
15 | max_prompt_length: int = field(default=512, metadata={"help": "dpo时,prompt的最大长度"})
16 | beta: float = field(default=0.1, metadata={"help": "The beta factor in DPO loss"})
17 | tokenize_num_workers: int = field(default=10, metadata={"help": "预训练时tokenize的线程数量"})
18 | task_type: str = field(default="sft", metadata={"help": "预训练任务:[pretrain, sft]"})
19 | train_mode: str = field(default="qlora", metadata={"help": "训练方式:[full, qlora]"})
20 | lora_rank: Optional[int] = field(default=64, metadata={"help": "lora rank"})
21 | lora_alpha: Optional[int] = field(default=16, metadata={"help": "lora alpha"})
22 | lora_dropout: Optional[float] = field(default=0.05, metadata={"help": "lora dropout"})
23 | use_unsloth: Optional[bool] = field(default=False, metadata={"help": "use sloth or not"})
24 |
--------------------------------------------------------------------------------
/component/collator.py:
--------------------------------------------------------------------------------
1 | from typing import Any, Dict, List
2 | import torch
3 | from loguru import logger
4 |
5 |
6 | class SFTDataCollator(object):
7 | def __init__(self, tokenizer, max_seq_length):
8 | self.tokenizer = tokenizer
9 | self.max_seq_length = max_seq_length
10 | self.pad_token_id = tokenizer.pad_token_id
11 |
12 | def __call__(self, batch: List[Dict[str, Any]]) -> Dict[str, Any]:
13 | # 找出batch中的最大长度
14 | lengths = [len(x['input_ids']) for x in batch if x['input_ids'] is not None]
15 | # 取出batch中的最大长度,如果超过max_seq_length,则取max_seq_length
16 | batch_max_len = min(max(lengths), self.max_seq_length)
17 | # batch_max_len = self.max_seq_length
18 |
19 | input_ids_batch, attention_mask_batch, target_mask_batch = [], [], []
20 | # truncate and padding
21 | for x in batch:
22 | input_ids = x['input_ids']
23 | attention_mask = x['attention_mask']
24 | target_mask = x['target_mask']
25 | if input_ids is None:
26 | logger.info('some input_ids is None')
27 | continue
28 | padding_len = batch_max_len - len(input_ids)
29 | # padding
30 | input_ids = input_ids + [self.pad_token_id] * padding_len
31 | attention_mask = attention_mask + [0] * padding_len
32 | target_mask = target_mask + [0] * padding_len
33 | # truncate
34 | input_ids = input_ids[:self.max_seq_length]
35 | attention_mask = attention_mask[:self.max_seq_length]
36 | target_mask = target_mask[:self.max_seq_length]
37 |
38 | input_ids_batch.append(input_ids)
39 | attention_mask_batch.append(attention_mask)
40 | target_mask_batch.append(target_mask)
41 |
42 | # 将list转换为tensor,得到最终的的模型输入
43 | input_ids_batch = torch.tensor(input_ids_batch, dtype=torch.long)
44 | attention_mask_batch = torch.tensor(attention_mask_batch, dtype=torch.long)
45 | target_mask_batch = torch.tensor(target_mask_batch, dtype=torch.long)
46 |
47 | labels = torch.where(target_mask_batch == 1, input_ids_batch, -100)
48 | inputs = {
49 | 'input_ids': input_ids_batch,
50 | 'attention_mask': attention_mask_batch,
51 | 'labels': labels
52 | }
53 | return inputs
54 |
55 |
56 | class PretrainCollator(object):
57 | def __init__(self, tokenizer, max_seq_length):
58 | self.tokenizer = tokenizer
59 | self.max_seq_length = max_seq_length
60 | self.pad_token_id = tokenizer.pad_token_id
61 |
62 | def __call__(self, batch: List[Dict[str, Any]]) -> Dict[str, Any]:
63 | batch = [x['input_ids'] for x in batch if x['input_ids'] is not None]
64 | # 找出batch中的最大长度
65 | lengths = [len(x) for x in batch]
66 | # 取出batch中的最大长度,如果超过max_seq_length,则取max_seq_length
67 | batch_max_len = min(max(lengths), self.max_seq_length)
68 | # batch_max_len = self.max_seq_length
69 |
70 | input_ids_batch, attention_mask_batch, labels_batch = [], [], []
71 | for x in batch:
72 | input_ids = x
73 | attention_mask = [1] * len(input_ids)
74 |
75 | padding_len = batch_max_len - len(input_ids)
76 | # padding
77 | labels = input_ids + [-100] * padding_len
78 | input_ids = input_ids + [self.pad_token_id] * padding_len
79 | attention_mask = attention_mask + [0] * padding_len
80 | # truncate
81 | input_ids = input_ids[:self.max_seq_length]
82 | labels = labels[:self.max_seq_length]
83 | attention_mask = attention_mask[:self.max_seq_length]
84 |
85 | input_ids_batch.append(input_ids)
86 | labels_batch.append(labels)
87 | attention_mask_batch.append(attention_mask)
88 |
89 | # 将list转换为tensor,得到最终的的模型输入
90 | input_ids_batch = torch.tensor(input_ids_batch, dtype=torch.long)
91 | labels_batch = torch.tensor(labels_batch, dtype=torch.long)
92 | attention_mask_batch = torch.tensor(attention_mask_batch, dtype=torch.long)
93 | inputs = {
94 | 'input_ids': input_ids_batch,
95 | 'attention_mask': attention_mask_batch,
96 | 'labels': labels_batch
97 | }
98 | return inputs
99 |
100 |
--------------------------------------------------------------------------------
/component/dataset.py:
--------------------------------------------------------------------------------
1 | import json
2 | from loguru import logger
3 | from torch.utils.data import Dataset
4 |
5 |
6 | class UnifiedSFTDataset(Dataset):
7 | """
8 | 统一的数据处理dataset
9 | """
10 | def __init__(self, file, tokenizer, max_seq_length, template):
11 | self.tokenizer = tokenizer
12 | self.template_name = template.template_name
13 | self.system_format = template.system_format
14 | self.user_format = template.user_format
15 | self.assistant_format = template.assistant_format
16 | self.system = template.system
17 |
18 | self.max_seq_length = max_seq_length
19 | logger.info('Loading data: {}'.format(file))
20 | with open(file, 'r', encoding='utf8') as f:
21 | data_list = f.readlines()
22 | logger.info(f'Use template "{self.template_name}" for training')
23 | logger.info("There are {} data in dataset".format(len(data_list)))
24 | self.data_list = data_list
25 |
26 | def __len__(self):
27 | return len(self.data_list)
28 |
29 | def __getitem__(self, index):
30 | # 每条数据拼接格式为: {system_format}{user_format}{assistant_format}{user_format}{assistant_format}...
31 | data = self.data_list[index]
32 | data = json.loads(data)
33 | input_ids, target_mask = [], []
34 |
35 | # setting system information
36 | if self.system_format is not None:
37 | system = data['system'].strip() if 'system' in data.keys() else self.system
38 | # system信息不为空
39 | if system is not None:
40 | system_text = self.system_format.format(content=system)
41 | input_ids = self.tokenizer.encode(system_text, add_special_tokens=False)
42 | target_mask = [0] * len(input_ids)
43 |
44 | conversations = data['conversation']
45 | # 拼接多轮对话
46 | for i, conv in enumerate(conversations):
47 | human = conv['human'].strip()
48 | assistant = conv['assistant'].strip()
49 |
50 | human = self.user_format.format(content=human, stop_token=self.tokenizer.eos_token)
51 | assistant = self.assistant_format.format(content=assistant, stop_token=self.tokenizer.eos_token)
52 |
53 | input_tokens = self.tokenizer.encode(human, add_special_tokens=False)
54 | output_tokens = self.tokenizer.encode(assistant, add_special_tokens=False)
55 |
56 | input_ids += input_tokens + output_tokens
57 | target_mask += [0] * len(input_tokens) + [1] * len(output_tokens)
58 |
59 | assert len(input_ids) == len(target_mask)
60 | # 对长度进行截断
61 | input_ids = input_ids[:self.max_seq_length]
62 | target_mask = target_mask[:self.max_seq_length]
63 | attention_mask = [1] * len(input_ids)
64 | assert len(input_ids) == len(target_mask) == len(attention_mask)
65 | inputs = {
66 | 'input_ids': input_ids,
67 | 'attention_mask': attention_mask,
68 | 'target_mask': target_mask
69 | }
70 | return inputs
71 |
72 |
73 | class ChatGLM2SFTDataset(UnifiedSFTDataset):
74 |
75 | def __getitem__(self, index):
76 | # 每条数据格式为: [gMASK]sop [Round 1]\n\n问:{input1}\n\n答:{target1}[Round 2]\n\n问:{input2}\n\n答:{target2}...
77 | data = self.data_list[index]
78 | data = json.loads(data)
79 |
80 | input_ids = self.tokenizer.get_prefix_tokens()
81 | target_mask = [0] * len(input_ids)
82 |
83 | conversations = data['conversation']
84 | # 拼接多轮对话
85 | for i, conv in enumerate(conversations):
86 | human = conv['human'].strip()
87 | assistant = conv['assistant'].strip()
88 |
89 | human = self.user_format.format(content=human, idx=i + 1)
90 | assistant = self.assistant_format.format(content=assistant)
91 |
92 | input_tokens = self.tokenizer.encode(human, add_special_tokens=False)
93 | output_tokens = self.tokenizer.encode(assistant, add_special_tokens=False) + [self.tokenizer.eos_token_id]
94 |
95 | input_ids += input_tokens + output_tokens
96 | target_mask += [0] * len(input_tokens) + [1] * len(output_tokens)
97 |
98 | assert len(input_ids) == len(target_mask)
99 | # 对长度进行截断
100 | input_ids = input_ids[:self.max_seq_length]
101 | target_mask = target_mask[:self.max_seq_length]
102 | attention_mask = [1] * len(input_ids)
103 | assert len(input_ids) == len(target_mask) == len(attention_mask)
104 | inputs = {
105 | 'input_ids': input_ids,
106 | 'attention_mask': attention_mask,
107 | 'target_mask': target_mask
108 | }
109 | return inputs
110 |
111 |
112 | class ChatGLM3SFTDataset(UnifiedSFTDataset):
113 |
114 | def __getitem__(self, index):
115 | # [gMASK]sop <|system|>xxx<|user|>xxx<|assistant|>xxx
116 | data = self.data_list[index]
117 | data = json.loads(data)
118 | system = data['system'].strip() if 'system' in data.keys() else self.system
119 | input_ids = self.tokenizer.get_prefix_tokens() + \
120 | [self.tokenizer.get_command(f"<|system|>")] + \
121 | self.tokenizer.encode(system, add_special_tokens=False)
122 | target_mask = [0] * len(input_ids)
123 |
124 | conversations = data['conversation']
125 | # 拼接多轮对话
126 | for i, conv in enumerate(conversations):
127 | human = conv['human'].strip()
128 | assistant = conv['assistant'].strip()
129 |
130 | input_tokens = [self.tokenizer.get_command(f"<|user|>")] + \
131 | self.tokenizer.encode(human, add_special_tokens=False) + \
132 | [self.tokenizer.get_command(f"<|assistant|>")]
133 | output_tokens = self.tokenizer.encode(assistant, add_special_tokens=False) + [self.tokenizer.eos_token_id]
134 |
135 | input_ids += input_tokens + output_tokens
136 | target_mask += [0] * len(input_tokens) + [1] * len(output_tokens)
137 |
138 | assert len(input_ids) == len(target_mask)
139 | # 对长度进行截断
140 | input_ids = input_ids[:self.max_seq_length]
141 | target_mask = target_mask[:self.max_seq_length]
142 | attention_mask = [1] * len(input_ids)
143 | assert len(input_ids) == len(target_mask) == len(attention_mask)
144 | inputs = {
145 | 'input_ids': input_ids,
146 | 'attention_mask': attention_mask,
147 | 'target_mask': target_mask
148 | }
149 | return inputs
150 |
151 |
152 | class UnifiedDPODataset(Dataset):
153 | """
154 | 统一的DPO数据集
155 | """
156 | def __init__(self, file, tokenizer, max_seq_length, max_prompt_length, template):
157 | self.tokenizer = tokenizer
158 | self.template_name = template.template_name
159 | self.system_format = template.system_format
160 | self.user_format = template.user_format
161 | self.assistant_format = template.assistant_format
162 | self.system = template.system
163 |
164 | self.max_seq_length = max_seq_length
165 | self.max_prompt_length = max_prompt_length
166 | logger.info('Loading data: {}'.format(file))
167 | with open(file, 'r', encoding='utf8') as f:
168 | data_list = f.readlines()
169 | logger.info(f'Use template "{self.template_name}" for training')
170 | logger.info("There are {} data in dataset".format(len(data_list)))
171 | self.data_list = data_list
172 |
173 | def __len__(self):
174 | return len(self.data_list)
175 |
176 | def build_prompt_input_ids(self, system, history):
177 | """
178 | chatglm2: [gMASK]sop [Round 1]\n\n问:{input1}\n\n答:{target1}[Round 2]\n\n问:{input2}\n\n答:{target2}...
179 | chatglm3: [gMASK]sop <|system|>xxx<|user|>xxx<|assistant|>xxx
180 | others: {system_format}{user_format}{assistant_format}{user_format}{assistant_format}...
181 | """
182 | # chatglm模型具有特殊的起始token
183 | if self.template_name in ['chatglm2', 'chatglm3']:
184 | prompt_input_ids = self.tokenizer.get_prefix_tokens()
185 | else:
186 | prompt_input_ids = []
187 |
188 | # collect system information
189 | if self.system_format is not None:
190 | system = system if system is not None else self.system
191 | # system信息不为空
192 | if system is not None:
193 | if self.template_name == 'chatglm3':
194 | prompt_input_ids += [self.tokenizer.get_command(f"<|system|>")] + self.tokenizer.encode(system, add_special_tokens=False)
195 | else:
196 | system_text = self.system_format.format(content=system)
197 | prompt_input_ids += self.tokenizer.encode(system_text, add_special_tokens=False)
198 |
199 | # collect history
200 | for i, conv in enumerate(history):
201 | role = conv['role'].strip()
202 | content = conv['content'].strip()
203 |
204 | assert role != 'system', 'there should not be more than one system information'
205 | if role == 'user':
206 | if self.template_name == 'chatglm2':
207 | human = self.user_format.format(content=content, idx=i//2 + 1)
208 | input_ids = self.tokenizer.encode(human, add_special_tokens=False)
209 | elif self.template_name == 'chatglm3':
210 | input_ids = [self.tokenizer.get_command(f"<|user|>")] + \
211 | self.tokenizer.encode(content, add_special_tokens=False) + \
212 | [self.tokenizer.get_command(f"<|assistant|>")]
213 | else:
214 | human = self.user_format.format(content=content, stop_token=self.tokenizer.eos_token)
215 | input_ids = self.tokenizer.encode(human, add_special_tokens=False)
216 | elif role == 'assistant':
217 | if self.template_name in ['chatglm2', 'chatglm3']:
218 | input_ids = self.tokenizer.encode(content, add_special_tokens=False) + [self.tokenizer.eos_token_id]
219 | else:
220 | assistant = self.assistant_format.format(content=content, stop_token=self.tokenizer.eos_token)
221 | input_ids = self.tokenizer.encode(assistant, add_special_tokens=False)
222 | else:
223 | raise Exception('role error')
224 | prompt_input_ids += input_ids
225 |
226 | return prompt_input_ids
227 |
228 | def __getitem__(self, index):
229 | data = self.data_list[index]
230 | data = json.loads(data)
231 | chosen = data['chosen']
232 | rejected = data['rejected']
233 | assert len(chosen) == len(rejected)
234 |
235 | # 判断第0个是否为system
236 | if chosen[0]['role'] == 'system':
237 | system = chosen[0]['content'].strip()
238 | history = chosen[1:-1] # 对话上文
239 | chosen, rejected = chosen[-1], rejected[-1]
240 | else:
241 | system = None
242 | history = chosen[:-1] # 对话上文
243 | chosen, rejected = chosen[-1], rejected[-1]
244 |
245 | # build prompt
246 | prompt_input_ids = self.build_prompt_input_ids(system, history)
247 |
248 | # build response
249 | if self.template_name in ['chatglm2', 'chatglm3']:
250 | chosen_input_ids = self.tokenizer.encode(chosen['content'], add_special_tokens=False) + [self.tokenizer.eos_token_id]
251 | rejected_input_ids = self.tokenizer.encode(rejected['content'], add_special_tokens=False) + [self.tokenizer.eos_token_id]
252 | else:
253 | chosen = self.assistant_format.format(content=chosen['content'], stop_token=self.tokenizer.eos_token)
254 | rejected = self.assistant_format.format(content=rejected['content'], stop_token=self.tokenizer.eos_token)
255 |
256 | chosen_input_ids = self.tokenizer.encode(chosen, add_special_tokens=False)
257 | rejected_input_ids = self.tokenizer.encode(rejected, add_special_tokens=False)
258 |
259 | # truncate by max_seq_length
260 | longer_response_length = max(len(chosen_input_ids), len(rejected_input_ids))
261 | # if combined sequence is too long, truncate the prompt
262 | if len(prompt_input_ids) + longer_response_length > self.max_seq_length:
263 | max_prompt_length = max(self.max_prompt_length, self.max_seq_length - longer_response_length)
264 | prompt_input_ids = prompt_input_ids[-max_prompt_length:]
265 | # if that's still too long, truncate the response
266 | if len(prompt_input_ids) + longer_response_length > self.max_seq_length:
267 | chosen_input_ids = chosen_input_ids[: self.max_seq_length - len(prompt_input_ids)]
268 | rejected_input_ids = rejected_input_ids[: self.max_seq_length - len(prompt_input_ids)]
269 |
270 | chosen_labels = [-100] * len(prompt_input_ids) + chosen_input_ids
271 | chosen_input_ids = prompt_input_ids + chosen_input_ids
272 | rejected_labels = [-100] * len(prompt_input_ids) + rejected_input_ids
273 | rejected_input_ids = prompt_input_ids + rejected_input_ids
274 | assert len(chosen_labels) == len(chosen_input_ids)
275 | assert len(rejected_labels) == len(rejected_input_ids)
276 |
277 | inputs = dict(
278 | prompt_input_ids=prompt_input_ids,
279 | prompt_attention_mask=[1]*len(prompt_input_ids),
280 | chosen_input_ids=chosen_input_ids,
281 | chosen_attention_mask=[1]*len(chosen_input_ids),
282 | chosen_labels=chosen_labels,
283 | rejected_input_ids=rejected_input_ids,
284 | rejected_attention_mask=[1]*len(rejected_input_ids),
285 | rejected_labels=rejected_labels,
286 | )
287 | return inputs
288 |
289 | # 为了适配DPOTrainer的接口
290 | def map(self, func, **kwargs):
291 | return self
292 |
--------------------------------------------------------------------------------
/component/loss.py:
--------------------------------------------------------------------------------
1 | import torch
2 | import torch.nn as nn
3 |
4 |
5 | class Loss(object):
6 | """
7 | 所有loss的类父类
8 | """
9 | def __call__(self, model, inputs, training_args, return_outputs=False):
10 | """
11 | todo label smoothing
12 | 用于计算loss。
13 | 看源码发现,return_outputs=True为train时调用,return_outputs=False为eval和predict调用
14 | :param model: 模型
15 | :param inputs: 模型输入,dict
16 | :param training_args: 训练配置参数
17 | :param return_outputs:是否返回模型的输出
18 | :return:
19 | """
20 | raise NotImplemented
21 |
22 |
23 | class TargetLMLoss(Loss):
24 |
25 | def __init__(self, ignore_index):
26 | super().__init__()
27 | self.ignore_index = ignore_index
28 | self.loss_fn = nn.CrossEntropyLoss(ignore_index=ignore_index)
29 |
30 | def __call__(self, model, inputs, training_args, return_outputs=False):
31 | input_ids = inputs['input_ids']
32 | attention_mask = inputs['attention_mask']
33 | target_mask = inputs['target_mask']
34 | # 模型前馈预测
35 | outputs = model(input_ids=input_ids, attention_mask=attention_mask, return_dict=True)
36 | logits = outputs["logits"] if isinstance(outputs, dict) else outputs[0]
37 |
38 | # 将labels中不属于target的部分,设为ignore_index,只计算target部分的loss
39 | labels = torch.where(target_mask == 1, input_ids, self.ignore_index)
40 | shift_logits = logits[..., :-1, :].contiguous()
41 | shift_labels = labels[..., 1:].contiguous()
42 | # Flatten the tokens
43 | loss = self.loss_fn(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
44 | return (loss, outputs) if return_outputs else loss
45 |
--------------------------------------------------------------------------------
/component/model.py:
--------------------------------------------------------------------------------
1 | import transformers
2 | from typing import Tuple, Union
3 | import torch
4 | from transformers.modeling_outputs import CausalLMOutputWithCrossAttentions, CausalLMOutputWithPast
5 | from component.loss import TargetLMLoss
6 | from transformers.utils import logging
7 |
8 |
9 | logger = logging.get_logger(__name__)
10 |
11 |
12 | class BloomForCausalLM(transformers.BloomForCausalLM):
13 | """
14 | 继承自BloomForCausalLM,区别在于只计算target部分的loss
15 | """
16 | def forward(
17 | self,
18 | input_ids=None,
19 | past_key_values=None,
20 | attention_mask=None,
21 | labels=None,
22 | target_mask=None,
23 | position_ids=None,
24 | head_mask=None,
25 | inputs_embeds=None,
26 | return_loss=False,
27 | use_cache=None,
28 | output_attentions=None,
29 | output_hidden_states=None,
30 | return_dict=None,
31 | ) -> Union[Tuple[torch.Tensor], CausalLMOutputWithCrossAttentions]:
32 | r"""
33 | labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
34 | Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set
35 | `labels = input_ids` Indices are selected in `[-100, 0, ..., config.vocab_size]` All labels set to `-100`
36 | are ignored (masked), the loss is only computed for labels in `[0, ..., config.vocab_size]`
37 | """
38 | return_dict = return_dict if return_dict is not None else self.config.use_return_dict
39 |
40 | transformer_outputs = self.transformer(
41 | input_ids,
42 | past_key_values=past_key_values,
43 | attention_mask=attention_mask,
44 | position_ids=position_ids,
45 | head_mask=head_mask,
46 | inputs_embeds=inputs_embeds,
47 | use_cache=use_cache,
48 | output_attentions=output_attentions,
49 | output_hidden_states=output_hidden_states,
50 | return_dict=return_dict,
51 | )
52 | hidden_states = transformer_outputs[0]
53 |
54 | lm_logits = self.lm_head(hidden_states)
55 |
56 | loss = None
57 | if return_loss:
58 | loss_fn = TargetLMLoss(ignore_index=self.config.pad_token_id)
59 | loss = loss_fn(lm_logits, input_ids, target_mask)
60 |
61 | if not return_dict:
62 | output = (lm_logits,) + transformer_outputs[1:]
63 | return ((loss,) + output) if loss is not None else output
64 |
65 | return CausalLMOutputWithCrossAttentions(
66 | loss=loss,
67 | logits=lm_logits,
68 | past_key_values=transformer_outputs.past_key_values,
69 | hidden_states=transformer_outputs.hidden_states,
70 | attentions=transformer_outputs.attentions,
71 | )
72 |
73 |
--------------------------------------------------------------------------------
/component/template.py:
--------------------------------------------------------------------------------
1 | from dataclasses import dataclass
2 | from typing import Dict
3 |
4 |
5 | @dataclass
6 | class Template:
7 | template_name:str
8 | system_format: str
9 | user_format: str
10 | assistant_format: str
11 | system: str
12 | stop_word: str
13 | # stop_token_id: int
14 |
15 |
16 | template_dict: Dict[str, Template] = dict()
17 |
18 |
19 | def register_template(template_name, system_format, user_format, assistant_format, system, stop_word=None):
20 | template_dict[template_name] = Template(
21 | template_name=template_name,
22 | system_format=system_format,
23 | user_format=user_format,
24 | assistant_format=assistant_format,
25 | system=system,
26 | stop_word=stop_word,
27 | # stop_token_id=stop_token_id
28 | )
29 |
30 |
31 | # 注册template
32 | register_template(
33 | template_name='default',
34 | system_format='System: {content}\n\n',
35 | user_format='User: {content}\nAssistant: ',
36 | assistant_format='{content} {stop_token}',
37 | system=None,
38 | stop_word=None
39 | )
40 |
41 | register_template(
42 | template_name='internlm',
43 | system_format="<|System|>:{content}\n",
44 | user_format='<|User|>:{content}\n<|Bot|>:',
45 | assistant_format='{content}\n',
46 | system="You are an AI assistant whose name is InternLM (书生·浦语).\n"
47 | "- InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless.\n"
48 | "- InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文.",
49 | stop_word=''
50 | )
51 |
52 | register_template(
53 | template_name='internlm2',
54 | system_format='<|im_start|>system\n{content}<|im_end|>\n',
55 | user_format='<|im_start|>user\n{content}<|im_end|>\n<|im_start|>assistant\n',
56 | assistant_format='{content}<|im_end|>\n',
57 | system="You are an AI assistant whose name is InternLM (书生·浦语).\n"
58 | "- InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless.\n"
59 | "- InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文.",
60 | stop_word='<|im_end|>'
61 | )
62 |
63 | register_template(
64 | template_name='qwen',
65 | system_format='<|im_start|>system\n{content}<|im_end|>\n',
66 | user_format='<|im_start|>user\n{content}<|im_end|>\n<|im_start|>assistant\n',
67 | assistant_format='{content}<|im_end|>\n',
68 | system="You are a helpful assistant.",
69 | stop_word='<|im_end|>'
70 | )
71 |
72 | register_template(
73 | template_name='yi',
74 | system_format='<|im_start|>system\n{content}<|im_end|>\n',
75 | user_format='<|im_start|>user\n{content}<|im_end|>\n<|im_start|>assistant\n',
76 | assistant_format='{content}<|im_end|>\n',
77 | system=None,
78 | stop_word='<|im_end|>'
79 | )
80 |
81 | register_template(
82 | template_name="orion",
83 | system_format='',
84 | user_format='Human: {content}\n\nAssistant: ',
85 | assistant_format='{content}',
86 | system='',
87 | stop_word='',
88 | )
89 |
90 | register_template(
91 | template_name='deepseek',
92 | system_format=None,
93 | user_format='User: {content}\n\nAssistant: ',
94 | assistant_format='{content}<|end▁of▁sentence|>',
95 | system=None,
96 | stop_word='<|end▁of▁sentence|>'
97 | )
98 |
99 | # todo 更优雅的实现方式
100 | register_template(
101 | template_name='chatglm2',
102 | system_format=None,
103 | user_format='[Round {idx}]\n\n问:{content}\n\n答:',
104 | assistant_format='{content}',
105 | system=None,
106 | stop_word='',
107 | )
108 |
109 | register_template(
110 | template_name='chatglm3',
111 | system_format='{content}',
112 | user_format='{content}',
113 | assistant_format='{content}',
114 | system="You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.",
115 | stop_word='',
116 | )
117 |
118 | register_template(
119 | template_name='ziya2',
120 | system_format=None,
121 | user_format=':{content} :',
122 | assistant_format='{content}',
123 | system=None,
124 | stop_word='',
125 | )
126 |
127 | register_template(
128 | template_name="xverse",
129 | system_format=None,
130 | user_format='Human: {content}\n\nAssistant: ',
131 | assistant_format='{content}<|endoftext|>',
132 | system=None,
133 | stop_word='<|endoftext|>',
134 | )
135 |
136 | register_template(
137 | template_name='minicpm',
138 | system_format=None,
139 | user_format='<用户>{content}',
140 | assistant_format='{content}',
141 | system=None,
142 | stop_word=''
143 | )
144 |
145 | register_template(
146 | template_name='minicpm3',
147 | system_format='<|im_start|>system\n{content}<|im_end|>\n',
148 | user_format='<|im_start|>user\n{content}<|im_end|>\n<|im_start|>assistant\n',
149 | assistant_format='{content}<|im_end|>\n',
150 | system="You are a helpful assistant.",
151 | stop_word='<|im_end|>'
152 | )
153 |
154 | register_template(
155 | template_name='zephyr',
156 | system_format='<|system|>\n{content}',
157 | user_format='<|user|>\n{content}\n<|assistant|>\n',
158 | assistant_format='{content}\n',
159 | system=None,
160 | stop_word=''
161 | )
162 |
163 | register_template(
164 | template_name='mistral',
165 | system_format='',
166 | user_format='[INST]{content}[/INST]',
167 | assistant_format='{content}',
168 | system='',
169 | stop_word=''
170 | )
171 |
172 | register_template(
173 | template_name='mixtral',
174 | system_format='',
175 | user_format='[INST]{content}[/INST]',
176 | assistant_format='{content}',
177 | system='',
178 | stop_word=''
179 | )
180 |
181 | register_template(
182 | template_name='baichuan',
183 | system_format=None,
184 | user_format='{content}',
185 | assistant_format='{content}',
186 | system=None,
187 | stop_word=''
188 | )
189 |
190 | register_template(
191 | template_name='baichuan2',
192 | system_format=None,
193 | user_format='{content}',
194 | assistant_format='{content}',
195 | system=None,
196 | stop_word=''
197 | )
198 |
199 | register_template(
200 | template_name='vicuna',
201 | system_format='{content}\n',
202 | user_format='USER: {content} ASSISTANT:',
203 | assistant_format='{content}',
204 | system="A chat between a curious user and an artificial intelligence assistant. "
205 | "The assistant gives helpful, detailed, and polite answers to the user's questions.",
206 | stop_word=''
207 | )
208 |
209 | register_template(
210 | template_name='llama2',
211 | system_format='<>\n{content}\n<>\n\n',
212 | user_format='[INST]{content}[/INST]',
213 | assistant_format='{content} ',
214 | system="You are a helpful, respectful and honest assistant. "
215 | "Always answer as helpfully as possible, while being safe. "
216 | "Your answers should not include any harmful, unethical, "
217 | "racist, sexist, toxic, dangerous, or illegal content. "
218 | "Please ensure that your responses are socially unbiased and positive in nature.\n\n"
219 | "If a question does not make any sense, or is not factually coherent, "
220 | "explain why instead of answering something not correct. "
221 | "If you don't know the answer to a question, please don't share false information.",
222 | stop_word=''
223 | )
224 |
225 | register_template(
226 | template_name='llama3',
227 | system_format='<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{content}<|eot_id|>',
228 | user_format='<|start_header_id|>user<|end_header_id|>\n\n{content}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n',
229 | assistant_format='{content}<|eot_id|>',
230 | system=None,
231 | stop_word='<|eot_id|>'
232 | )
233 |
234 | register_template(
235 | template_name='gemma',
236 | system_format='',
237 | user_format='user\n{content}\nmodel\n',
238 | assistant_format='{content}\n',
239 | system='',
240 | stop_word=''
241 | )
242 |
243 | register_template(
244 | template_name='phi3',
245 | system_format=None,
246 | user_format='<|user|>\n{content}<|end|>\n<|assistant|>',
247 | assistant_format='{content}<|end|>\n',
248 | system=None,
249 | stop_word='<|end|>'
250 | )
251 |
252 | # if __name__ == '__main__':
253 | # model_name_or_path = ''
254 |
255 |
--------------------------------------------------------------------------------
/component/trainer.py:
--------------------------------------------------------------------------------
1 | import transformers
2 | from transformers import (
3 | PreTrainedModel,
4 | TrainingArguments,
5 | DataCollator,
6 | PreTrainedTokenizerBase,
7 | EvalPrediction,
8 | TrainerCallback,
9 | )
10 | from typing import Callable, Dict, List, Optional, Tuple, Union, Any
11 | from torch import nn
12 | from torch.utils.data import Dataset, DataLoader
13 | from transformers.utils import (
14 | logging,
15 | )
16 | from typing import Optional
17 | import os
18 | import torch
19 |
20 |
21 | logger = logging.get_logger(__name__)
22 |
23 | # Name of the files used for checkpointing
24 | TRAINING_ARGS_NAME = "training_args.bin"
25 | TRAINER_STATE_NAME = "trainer_state.json"
26 | OPTIMIZER_NAME = "optimizer.pt"
27 | SCHEDULER_NAME = "scheduler.pt"
28 | SCALER_NAME = "scaler.pt"
29 |
30 |
31 | class Trainer(transformers.Trainer):
32 | """
33 | 主要修改逻辑:通过传入compute_loss,支持自定义loss计算方式
34 | """
35 | def __init__(
36 | self,
37 | model: Union[PreTrainedModel, nn.Module] = None,
38 | args: TrainingArguments = None,
39 | data_collator: Optional[DataCollator] = None,
40 | train_dataset: Optional[Dataset] = None,
41 | eval_dataset: Optional[Dataset] = None,
42 | tokenizer: Optional[PreTrainedTokenizerBase] = None,
43 | model_init: Callable[[], PreTrainedModel] = None,
44 | compute_metrics: Optional[Callable[[EvalPrediction], Dict]] = None,
45 | callbacks: Optional[List[TrainerCallback]] = None,
46 | optimizers: Tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR] = (None, None),
47 | preprocess_logits_for_metrics: Callable[[torch.Tensor, torch.Tensor], torch.Tensor] = None,
48 | compute_loss=None,
49 | ):
50 | super(Trainer, self).__init__(
51 | model=model,
52 | args=args,
53 | data_collator=data_collator,
54 | train_dataset=train_dataset,
55 | eval_dataset=eval_dataset,
56 | tokenizer=tokenizer,
57 | model_init=model_init,
58 | compute_metrics=compute_metrics,
59 | callbacks=callbacks,
60 | optimizers=optimizers,
61 | preprocess_logits_for_metrics=preprocess_logits_for_metrics,
62 | )
63 | self.loss_func = compute_loss
64 |
65 | def compute_loss(self, model, inputs, return_outputs=False):
66 | """
67 | 重写loss的计算方式
68 | How the loss is computed by Trainer. By default, all models return the loss in the first element.
69 |
70 | Subclass and override for custom behavior.
71 | """
72 | if self.loss_func is None:
73 | loss = super().compute_loss(model, inputs, return_outputs)
74 | else:
75 | loss = self.loss_func(model, inputs, self.args, return_outputs)
76 | return loss
77 |
78 |
79 | class LoRATrainer(Trainer):
80 | """
81 | 修改checkkpoint的保存逻辑,只保存lora
82 | """
83 | def _save(self, output_dir: Optional[str] = None, state_dict=None):
84 | # If we are executing this function, we are the process zero, so we don't check for that.
85 | output_dir = output_dir if output_dir is not None else self.args.output_dir
86 | os.makedirs(output_dir, exist_ok=True)
87 | logger.info(f"Saving model checkpoint to {output_dir}")
88 | # 保存lora权重和配置
89 | self.model.save_pretrained(
90 | output_dir, state_dict=state_dict, safe_serialization=self.args.save_safetensors
91 | )
92 |
93 | if self.tokenizer is not None:
94 | self.tokenizer.save_pretrained(output_dir)
95 |
96 | # Good practice: save your training arguments together with the trained model
97 | torch.save(self.args, os.path.join(output_dir, TRAINING_ARGS_NAME))
--------------------------------------------------------------------------------
/component/utils.py:
--------------------------------------------------------------------------------
1 | from transformers import AutoModelForCausalLM, BitsAndBytesConfig
2 | import torch
3 | from peft import PeftModel
4 |
5 |
6 | class ModelUtils(object):
7 |
8 | @classmethod
9 | def load_model(cls, model_name_or_path, load_in_4bit=False, adapter_name_or_path=None):
10 | # 是否使用4bit量化进行推理
11 | if load_in_4bit:
12 | quantization_config = BitsAndBytesConfig(
13 | load_in_4bit=True,
14 | bnb_4bit_compute_dtype=torch.float16,
15 | bnb_4bit_use_double_quant=True,
16 | bnb_4bit_quant_type="nf4",
17 | llm_int8_threshold=6.0,
18 | llm_int8_has_fp16_weight=False,
19 | )
20 | else:
21 | quantization_config = None
22 |
23 | # 加载base model
24 | model = AutoModelForCausalLM.from_pretrained(
25 | model_name_or_path,
26 | load_in_4bit=load_in_4bit,
27 | trust_remote_code=True,
28 | low_cpu_mem_usage=True,
29 | torch_dtype=torch.float16,
30 | device_map='auto',
31 | quantization_config=quantization_config
32 | )
33 |
34 | # 加载adapter
35 | if adapter_name_or_path is not None:
36 | model = PeftModel.from_pretrained(model, adapter_name_or_path)
37 |
38 | return model
39 |
--------------------------------------------------------------------------------
/data/pretrain/dummy_pretrain.jsonl:
--------------------------------------------------------------------------------
1 | {"text": "布偶猫一般在7个月大会开始发情,但是第一次发情并不能代表已经发育成熟,并且也是不可以配种的;因为布偶猫比一般的猫成年更晚,因此身体发育成熟得也会更晚,如果想要给布偶猫进行配种繁育的话,应在雌猫2岁以后,雄猫应达到2岁半以后为宜。否则过早给布偶猫配种会影响胎儿质量,甚至导致早产、难产、存活率低等等。\n1.绝育如果不想给猫繁育的主人,可以等待猫咪发情期结束后带猫咪去进行绝育手术,发情主要是由于猫体内的激素分泌上升导致,要想彻底稳定激素分泌只能通过绝育手术的方式,摘除雄猫的睾丸来让激素保持在一个稳定的状态,还可延长猫咪的寿命,并且还能有效预防患前列腺疾病。绝育手术注意不能再发情期内进行,易导致大出血而发生意外。2.转移注意力以用零食、小鱼干吸引猫咪注意,然后多撸猫帮助它梳理毛发,按摩缓解身体不适。有些猫咪平时食用猫薄荷有镇定效果的,可以给猫咪喂食猫薄荷缓解,但是平时没有效果的就不要喂了,避免适得其反,造成猫咪更加兴奋。3.热垫缓解给猫窝做好保暖措施,增加一条毛毯、能自动加热的热垫,因为温暖的环境会让猫咪感到放松,能有效缓解猫咪的焦躁情绪,让它镇静下来。\n"}
2 | {"text": "本学期校内奖学金即日起接受同学的申请,欲申请者请于3/15(二)前上网点选,其中申请清寒类奖助学金者,别忘了检附清寒证明及户籍誊本等相关资料,缴交至台北生辅组或桃园校区学务组,俾利汇整办理。 近年奖学金申请件数不断提升,在僧多粥少的竞争下,多数人只能望梅兴叹!建议成绩表现不错的同学不妨挑选有学系限制的奖项,如蔡雁舲(限法律)、程修璜(限统资)、黄健铭(限资工)、杨济远(限传院)等,以提升获奖几率。此外,本学期新增“校外赁居生奖学金”,曾参与赁居生服务,且能提供具体证明的同学,不妨一试。学务处表示,除了校内各项奖学金外,校外也有不少奖助学金可供申请,同学不妨多注意布告栏的相关资讯。"}
3 | {"text": "碧桂园云河上院项目是北京碧桂园在武清的第5个项目,碧桂园在武清的第7个项目。北京碧桂园从2016年入驻武清,历经三年深耕,一年筹备,云河上院项目即将上线。 碧桂园云河上院项目(占地约11.7万㎡)总建面约16.9万㎡,规划住宅约1469套。小区规划15栋16-18层的小高层(面积段约88㎡-109㎡的两室和三室)、及31栋4层叠拼组合而成,叠拼分为上叠与下叠,1-2层为上叠,3-4层为上叠拼。建筑外立面为目前高品质社区流行的北美风格,米黄色与棕色结合,风格简约。外墙高档质感涂料,保证外观的历久弥新。小区整体的绿化率高达40%,打造容积率仅为1.5的高端低密品质社区。\n现有洋房火爆派筹中,户型:85㎡通透两居,105㎡通透三居,115㎡通透三居(两卫),均价11000-12000元,先派先选!\n140平米叠拼别墅重磅来袭,即刻启动派筹,预估单价14000元/平米!\n"}
4 | {"text": "直流稳压电源是一种可以为负载提供稳定的直流电源的电子设备,大多数直流稳压电源供电电源是交流电源。即使交流电源的电压或负载电阻发生变化,稳压电源的直流输出电压也保持稳定。随着电子设备向高精度,高稳定性和高可靠性的方向发展,直流稳压电源对电子设备的电源提出了很高的要求。\n1、首先根据所需的张力逐渐调整“粗调”按钮,然后逐渐调整“细调”按钮,以确保正确配合。例如,如果需要输出12V的电压,则必须将“粗调”按钮设置为15V档,然后将“细调”按钮设置为12V档,不然就不能到达12V最大输出电压将不会达到12V。\n2、设置所需的电压,然后将其重新连接到负载。\n3、如果在操作期间需要更改“粗调”档,则必须首先断开负载,将输出电压设置为所需值,然后再连接负载。\n4、如果在运行过程中负载短路或过载,请首先断开负载,然后按“恢复”按钮或关闭电源然后再打开,以将电压恢复到正常运行状态。对加载进行故障排除后连接。\n5、串联连接具有不同标称电流的电源单元时,输出电流必须对应于最小标称电流的标称值。\n6、每个电源都有一个测量头,用于显示不同A / V状态下通道的输出电流或输出电压。通常放在电压指示状态。\n7、每个通道都有两个输出连接器,红色和黑色。红色连接表示“ +”,黑色连接表示“-”,控制面板中央带有黑色符号“ earth”的黑色连接表示该连接。连接到外壳,并连接到每个插座。一个输出没有电气连接,仅用作安全线。容易理解的是,符号“接地”表示接地,“ +”和“-”表示以双倍功率为运算放大器供电的正负输出功率。\n"}
5 | {"text": "银嘉集团版图扩张再添虎翼!5月10日,银嘉集团旗下浙江银嘉新材料有限公司(以下简称“银嘉新材”)投产启动仪式在董事长孔建国先生的家乡金华拉开帷幕。中国欧洲经济技术协会理事长潘锋先生,金东区委书记李雄伟先生、金东区政协主席王瑞海先生、 金东区委常委、统战部长张春阳先生,金东区委常委、区政府党组成员王新永先生,金东区政府党组成员、副区长张向明先生携金东区人社局、区应急管理局、区市场监管局、区投资促进中心、区税务局、区自然资源与规划分局、区生态环境分局、区消防大队、区供电局等单位主要领导莅临现场。\n金东区委书记李雄伟先生、金东区政协主席王瑞海先生、银嘉集团董事长孔建国先生、银嘉新材总经理王金鑫先生为项目启动盛大揭牌。\n揭牌仪式,前排领导从左至右为:浙江银嘉新材料有限公司总经理王金鑫先生、金东区政协主席王瑞海先生、金东区区委书记李雄伟先生、银嘉集团董事长孔建国先生\n自2020年2月以来,新冠病毒肆虐,随着疫情的全球化蔓延,全球市场对于以医疗防护用品、公共战略物资需求日益增大,在此背景下,银嘉集团坚决响应政府号召,临危受命,闻令而动,决定布局公共卫生战略物资生产领域,为解决抗疫物资生产紧缺现状,企业积极投身到核心原材料——熔喷布的生产任务中,并创办了浙江银嘉新材料有限公司,力争能从源头上解决口罩产能紧缺问题,为全球疫情防控做出力所能及的贡献。\n银嘉集团董事长孔建国先生在投产启动仪式上致欢迎词,他表示:经过30个昼夜的连续奋战,银嘉新材一期熔喷布项目全面建成投产。还记得1个月前的今天,区委区政府的王瑞海主席、张春阳部长陪同我们对接了厂房,王新永常委协助我们租赁厂房并多次召开专题会加快推进。与此同时,政府各部门也给了我们很大的支持,各部门互相配合,高效运作,共同推进银嘉新材项目的落地和建设,真正实现了“从考察厂址到机器运转20天时间”!感谢政府各部门给予我们的大力支持和帮助,让银嘉新材能在短短的一个月内落地,同时,也让我们见识到了什么是“金东速度”!在企业筹备的过程中,金东区投资促进中心和江东镇政府的高效办事速度和踏实严谨的务实作风给我们留下了很深的印象,感谢金东区政府为企业打造了一个营商生态最优区!\n作为中欧协会欧委会副会长单位,银嘉集团早在疫情发展之初即多次对外进行防护物资捐赠,受到欧盟各国及社会各界的好评。揭牌仪式上,中国欧洲经济技术协会理事长潘锋先生对银嘉集团及孔建国先生给予高度评价,他表示,世界各国相互联系、相互依存,人类是一个你中有我、我中有你的命运共同体,全民抗疫之下,银嘉集团积极行动、主动作为,彰显了“大爱互助,不忘初心”的企业文化,体现了企业的社会担当与奉献精神,表达了银嘉参与构建人类命运共同体的角色担当。\n成立伊始,银嘉新材致力成为 SMS无纺布、MB 熔喷无纺布、企业工程塑料、新型复合材料等高分子材料研发制造的高新技术企业。公司位于经济发达的长江三角洲地区浙江省金华市,是金华市重点招商引资企业,注册资本金 10000 万元,公司创始人孔建国先生被授予“2019 年金华发展突出贡献奖”,银嘉新材料的成立,将为银嘉集团多元业务版图扩张再添虎翼。\n骏业日新,鸿犹大展。银嘉集团历经十一年的创业历程,自创办至今,一直不忘初心使命,一路披荆斩棘、勇往直前。站在全新的发展新起点,银嘉新材将持续加大研发投入,提升科技创新实力,继续坚持科学发展观,在以熔喷布、无纺布产业为龙头,新材料产业为基础,国际贸易为纽带,国际合作为手段的新的发展格局下,打造出一个浙江地区最大公共卫生战略物资生产基地。银嘉人会紧跟金东区委区政府的步伐,政企齐心,为高质量建设家乡“和美金东”、高水平打造“希望新城”贡献自己的一份力量!\n"}
6 | {"text": "故事概述:成语蛮争触斗的故事讲术的是蛮争触斗典故喜欢一个人需要一个理由,恨一个人也只需要一个理由!幸福总是短暂的,更何况我们的爱并不会让世俗所接受,我曾想过他还是一个男孩子,而我已经身不由己,肩负了这样那样的一大堆责任,不能给他朝夕相伴的幸福,携手到老的承诺,有的只是瞬间的美丽,就犹如天空的烟花拼死的美丽,瞬间的夺目,而后就是深深的黑夜,让人窒息的黑暗。\n成语蛮争触斗的故事描述:\n传说古代有一只蜗牛的两个触角上有两个小国,左边的叫触氏国,右边的叫蛮氏国。两个国家因为争夺地盘而经常发生战争,有时竟伏尸百万,血流成河,造成民不聊生,怨声载道,蜗牛因此而丧失触觉功能。\n蛮争触斗典故的意思:蛮、触:蛮氏、触氏,《庄子》寓言中的在蜗牛两角的两个小国。因细小的缘故而引起的争端。"}
7 | {"text": "最近在俄罗斯雅库特结束的讨论发展远东经济,以及建设当地基础设施的国际会议上,俄罗斯官方人士在非正式场合透露,中国紧盯西伯利亚地区的资源特别是油气资源。几家中国国有企业,包括一家中国能源巨头派出了大型代表团参加这次会议。俄罗斯官员说,中国在加紧考查西伯利亚各地投资气候和经商环境的同时,更不忘记利用各种机会积极在当地建立政商关系。\n位于西伯利亚北部和远东地区的雅库特共和国气候条件恶劣,冬季最低气温达零下摄氏71度。但俄罗斯官员说,由于当地资源丰富,中国对这一地区产生兴趣并不奇怪。\n雅库特政府对外联络部副部长库里科夫说 :“中国对雅库特的石油、天然气、钻石、黄金开采都有兴趣。但这里的问题是,雅库特作为俄罗斯的一部分,有些事情无法单独决定。这包括油气和矿产资源的开采,特别是这些资源的对外出口,这些都属于莫斯科中央政府和联邦法律的管辖范围,这并不单纯取决于我们地方的愿望。”\n一名不愿意透露姓名的雅库特地方官员说,叶利钦时代,雅库特地方政府的自主权很大。但普京执政后,大多数权力都被中央政府收回。雅库特尽管资源丰富,但仍然依靠国家财政补贴,当地资源都被来自莫斯科的能源巨头们控制。\n*对待中国 俄精英难达共识*\n另一名俄罗斯官方人士私下场合分析认为,中国想获取西伯利亚资源,仍然面临众多挑战。除了需要同地方精英阶层搞好关系外,中国还必须要满足在莫斯科的各个利益集团的需求,而这做起来更难。另外,俄罗斯精英阶层,包括地方精英阶层,在如何看待中国资本方面仍然存在巨大分歧,没有共识。有人主张利用中国投资开发远东和西伯利亚,但也有人认为中国是威胁。\n*副总理:只能投资高附加值产业*\n雅库特政府第一副总理阿列克谢耶夫说,他惊叹中国取得的经济成就。但中国要想来当地投资,只能投资附加值高的产业。\n阿列克谢耶夫说“我们准备考虑中国投资人提出的投资计划,我们对日本、韩国、美国等外国投资人也是如此。我们希望这些投资人能带来最先进的科技和设备,使开采出的原材料能拥有最大的附加值。”\n世界银行俄罗斯和中亚地区生态与社会项目协调人格奥尔吉耶娃说,中国是否愿意来西伯利亚、雅库特投资,当地的投资气候是否符合中国的胃口,这只能去问中国人。但另一方面,不仅仅中国,十多个国家都派代表参加雅库特国际会议,这说明这个地区确实引起多国投资人的兴趣。\n格奥尔吉耶娃说:“其实这是个独一无二的地区。当地的面积相当于印度,但人口少,而出生率却高于俄罗斯平均水平。这个地区是非常有前途的。所以我们也非常感兴趣来研究同这个地区合作的可能。”\n雅库特是俄罗斯境内面积最大的地区,当地人口不足一百万。在居民中,雅库特人占46%,俄罗斯人占42%。俄罗斯远东石油管道穿过雅库特共和国。几家主要的俄罗斯能源巨头都在当地拥有油田和天然气田。当地的支柱产业是钻石、黄金、石油、天然气以及煤炭的开采。根据雅库特共和国公布的资料,当地拥有全世界35%的钻石储藏,5%的锡矿储藏,6%的铀矿储藏。\n雅库特地方官员透露,他们接触过资本雄厚的中国投资人。但迄今为止,同其他外国投资人一样,中国仍在观望考查,双方仍然没有大的投资合作项目。\n"}
8 | {"text": "“智能”作为新时期的热词备受家电行业的关注,越来越多的企业正不断拓宽其智能化道路,尤其是在中国家电市场零售规模触碰天花板的大背景下,智能家居和智能家电成为万众瞩目的焦点。\n研究智能家居产业的发展情况,我们需要先明确一下智能家居的研究范畴。首先,智能家居应该是一个生态圈,是以住宅为平台,基于物联网技术,由硬件(智能家电、智能硬件、安防控制设备、家俱等)、软件系统、云计算平台构成的一个家居生态圈。其次,在这个生态圈里,家居设备之间可以互联互通、实现远程人机交互与控制。最后,设备具备自我学习、自我适应能力,并且能够并通过收集、分析用户行为数据为用户提供更安全、舒适、节能、高效、便捷的个性化服务。\n美国是全球第一个进入智能家居市场的国家,在家庭自动化的需求和渗透方面处于领先地位,其次是欧洲市场。与西方发达国家相比,我国智能家居的推进仍有很长一段路要走。\n在人工智能、大数据等技术的发展带动下,我国智能家居市场目前正处于发展期。首先,市场上的智能硬件产品普及率相对较高,智能音箱、机器人、智能电视等产品争相抢夺智能家居控制中心地位,其中智能音箱产品率先验证了其作为控制中心的可行性。其次,智能家居虽然是市场的主流趋势,但产品本身智能化程度低,使用体验不够完善,大多数消费者对智能家居产品仍处于观望态度,因此市场需进一步加强教育。最后,目前智能家居市场鱼龙混杂,各自为政,没有统一的标准,各个产品成为信息孤岛,智能家居平台初步搭建完成,智能家居体系亟待完善。\n经过了几年的发展,我国智能家居行业产业链已基本明晰:产业链的上游主要由提供元器件/零部件、系统、软件的供应链企业及代工厂组成;中游主要是提供解决方案的系统解决方案提供商和生产制造智能产品的硬件厂商组成;下游由各种触达消费者的渠道以及智能家居平台和智能家居APP构成。从与用户交互的重要性角度来看,智能家居产品以及智能家居平台是产业链的关键成功要素。\n此外,行业的边界正逐渐模糊,跨界既是趋势,亦是必然。互联网企业、硬件厂商、家装、家居家俱、设计师、地产商和各类服务商等都是智能家居生态圈的潜在的参与和创建者。\n智能家电,是智能家居各类产品中与用户交互最频繁、最紧密的一环。从零售市场的数据来看,目前智能电视、智能空调的零售量渗透率最高,零售量规模也最大,而其他智能家电产品的规模扩张速度亦十分可观。智能家电零售市场迎来群雄逐鹿的时代,而这也预示着智能家电的黄金时代正在到来。\n我们主要挑选了芯片和智能语音两个领域展开数据分析。受宏观政策环境、技术进步与升级、人工智能应用普及等众多利好因素的影响,中国AI芯片市场将进一步发展。预计到2022年,全球AI芯片市场规模将会达到352亿美元,中国市场将达368亿元。\n总体来看,国产MCU不论是市场份额还是技术水平,都和国外企业有一段距离。对于中国企业而言,目前8位MCU占据着主流市场,占比50%左右。16/32位MCU占比分别为20%左右。中美贸易战使得国产芯片替代的概念越炒越热,部分厂商逐步实现中高端转移,迎来了新的机遇。智能家居的发展带动国产MCU需求扩大,为国产MCU发展带来强有力的推动作用\n2014年智能路由器成为智能家居行业的切入口,而后传统企业理所当然选择擅长的产品作为抢占流量的入口。2017年,智能音箱因语音交互的搭载,大受市场青睐,2018年智能音箱增幅823%。2019年,带屏交互入口成为市场宠儿,智能投影、屏幕音箱、智能电视等预计有着长足的发展。视觉交互在效率、体验、安全感等方面均优于听觉交互。\n企业积极布局参与前装市场,精装修成为推动智能家居快速普及的重要推手。据奥维云网数据显示,2020年我国精装修市场智能部品配套规模快速增长,其中以智能安防、智能门锁部品规模最大,智能坐便器、智能开关、智能家电、智能花洒等产品增长也十分迅速。智能家电在零售市场的规模也将迎来进一步增长。\n目前我国智能家居在推广和普及过程中仍面临诸多问题。未来,行业成功的关键要素将集中在技术、标准、人才、成本以及体验的提升上:(1)技术是影响智能家居软硬件发展及用户体验效果的关键因素;(2) 只有制定了统一的标准,才能促进行业快速发展并净化行业,优胜劣汰;(3)充足的高科技人才是保证智能家居行业发展的基础;(4)降低成本,拉低用户购买门槛,增强用户接受度,加速普及;(5)加强体验效果,增加体验渠道。\n各项前沿技术发展将助力智能家居场景进一步实现。5G应用范围的进一步拓宽将打破智能化生活的门槛。随着人工智能的成熟,语音识别、图像识别等基础技术将成为智能家居的标准配置,通过挖掘用户的设备使用行为,优化产品策略和市场策略,建立用户画像加大二次销售,通过活动状态分析与故障率分析加速智能家居从智能化到数据化。\n当智能家居的单品不再是信息孤岛,而是组成相应的智能家居场景化系统,从日常生活场景中收集用户数据,提供精准的个性化服务,智能家居才能真正成为完整的体系。在智能家居套系化的基础上,以智能家居产品为触角,主动获取消费者的生活习惯数据,进行数据挖掘和分析,将分析结果与第三方服务商对接,向消费者提供个性化服务,由此实现智能家居的“生态圈”盈利模式。\n"}
9 | {"text": "近日,某影都在青岛举行启动仪式,众多国际国内大牌明星汇聚一堂,人气男星钟汉良也在其中之列。深受欢迎的他更为粉丝着想,借此机会安排了与青岛粉丝的一场气氛热烈的见面会,并聊起自己的近况,除了正在热拍的《勇士之城》,钟汉良还笑谈: 我是最特别的乔峰!\n原来,除电视剧《新天龙八部》之外,钟汉良还将在同名电影、游戏中继续担任乔峰一角,如此 三位一体 ,的确堪称是史上最 特别 的乔峰。这一消息早在官方公布前就已经在粉丝间不胫而走, 泄密人 正是钟汉良自己。\n此次青岛之行钟汉良收获颇丰,除了喜逢 好久不见 的好友黄晓明外,钟汉良更见到了自己的 偶像 好莱坞著名电影明星约翰?特拉沃尔塔,并与之亲切交谈,分享电影表演心得。\n更让他出乎意料的是,得知此次活动消息,来自全国的近400名粉丝主动集结青岛以表支持。然而,由于主办单位接到安保管制通知,活动临时停止对外开放粉丝区域。为了回馈热情的粉丝,不让他们白跑一趟,钟汉良及其经纪公司立即沟通联系各方,特别为粉丝们安排了一场 特别见面会 ,令粉丝们倍受感动。到场粉丝非常热情,其中更有70多岁的老奶奶。钟汉良与粉丝们分批拍照、更透露自己近期的工作计划,现场气氛热烈,笑声不断。"}
10 | {"text": "31 4 第四章 资源动态调配 4.1 引言 应急救援领域内,资源调配是救援过程中的关键环节,它直接关系到整个 救援工作的成败。国内外许多学者对应急救援过程中物资调配的诸多问题进行 了研究,提出了各种模型和处理方法。例如:王旭坪,傅克俊等 [45] 从系统工程 的角度出发,提出了应急物流系统的结构和快速反应机制,包括应急物流系统 的目标、约束条件,系统地功能和反馈控制机制等,从宏观上分析了应急救援 过程中物资调配的若干问题。李磊[46] ,聂高众 [47] 等收集和分析了大量的地震资 料和数据,将地震应急救援所需资源进行量化,并提出了所需资源的计算公式。 Fiedrich 等 [48] 在时间、资源数量和质量有限的情况下,以死亡人数最小作为目 标,研究了地震后向多个受灾地点分配和运输资源的优化模型。Ali Haghani 等 [49] 利用数学规划方法建立了应急医疗系统的急救车辆调度优化模型并进行了仿 真验证。刘春林、何建敏等 [50][51] 研究了物资需求约束条件下多出救点的组合出 救的资源调配问题,提出了基于\"时间最短\"、\"出救点数目最少\"的多目标数学 模型。这些资料为我们研究机场应急救援管理系统中的资源调配问题提供了可 以借鉴的思路和数学模型。 具体到民航领域,突发事件的应急处理过程中不但需要调动机场公司内部 单位的各类救援资源,必要的情况下更需要调动机场协议单位的各类资源。合 理的调动这些资源,不仅能够保证足够的救援资源在最短的时间里到达救援现 场,还能够保证救援资源的合理使用,提高现场救援的效率。但是,由于救援 资源,特别是协作单位的资源,数量有限,它们并不是为一次救援行动服务的, 在很多地方都需要它们。所以,在事件处理过程中,当需要调配的资源规模和 总量确定时,仍有许多不确定因素影响着资源的详细调配过程。例如:在实际 调配过程中有可能出现某些救援单位无法联系,或者该单位不能提供理论上应 该提供的资源数量。这样,当某种需要调配的救援资源的规模和总量确定时, 在具体调配该资源的过程中,救援指挥人员与决策者就不得不考虑如下几个问 题:按照何种优先次序调配各单位的资源(该资源应该由哪些单位提供);具体 到每个单位的资源应该调配多少(各单位资源的理论调配数量);在调配过程中 如果出现特殊情况(例如某些单位无法联系或该单位不能完整的提供指定的资 32 源数量)时该怎么办(调配过程中的意外情况)等。这些都是值得仔细分析和研究 的问题。能否合理妥善的解决这些问题,直接影响到整个救援过程的时间和效 率。 本章分析了机场应急资源的调配过程中可能遇到的若干问题,在参考和借 鉴其他领域内应急物资的各类调配处理方法的基础上,提出一种机场应急物资 的调配策略,将资源的调配过程进行规范化,并给出了资源调配的计算公式。 4.2 资源调配与事件处理流程 在某次突发事件的应急救援工作中,生成总体救援预案、修订救援方案、 资源调配等都是事件处理流程的重要组成部分。因此在介绍资源的动态调配之 前我们有必要了解一下事件的处理流程(图 4.1)。当事件发生时,指挥者和决策 者首先根据报警信息决策出事件的种类及救援等级,然后根据事件种类等信息 制定出总体救援方案,救援方案中包括事件的具体处理方法及过程、各种所需 资源的规模和总量等。资源调配正是在各种所需资源的总量已经估算出来的情 况下进行的。同时,在实际救援过程中还可能发生事件升级的情况,此时就需 要重新修订救援方案,重新追加救援资源。 由(图 4.1)可以看出,机场应急救援工作十分复杂,每一步骤完成的好坏直 接影响到下一步的工作,而资源调配部分是事件处理流程的核心内容之一,资 源调配方案设计的好坏则直接影响到整个救援过程能否顺利进行。因此利用先 进的计算机技术和结构化过程化的一些思想设计一个合理高效的资源动态调配 方案,用该方案作为辅助手段来帮助决策者顺利、高效的完成救援工作的资源 调配,对整个救援工作都有着十分重要的意义和价值。 33 图 4.1 事件处理流程图 定量 NO YES 选 择 最 优 路 经验总结 (定性) 报警信息 形成 总体救援方案 各救援小组和 单位的备战状态 救援等级 事件种类 各类待调资源的 名称及待调总量 修订 救援方案 资源调配 初始方案 动态调配 资源 反馈信息 继续救援直至救援工作完成 赶赴现场 施救 事 件 处 理 过 程 二次事件? 资 源 调 配 34 4.3 资源调配方案 由(图 4.1)可知,资源调配分为两个步骤:首先由系统自动生成某种资源调配 的初始方案,初始方案中包含提供该资源的所有单位(按离救援现场的路途远近 或到达时间的先后顺序排列)和每个单位(以自己拥有资源的原始数量为基础)可 以提供的资源数量(即计划调配数量);然后进入实际调配过程,在调配过程中针 对出现的特殊情况(例如某个单位无法联系或该单位不能完整的提供指定的资 源数量)对初始调配方案进行动态的调整。下面分别介绍两个步骤的具体实现过 程。 4.3.1 资源调配初始方案 资源调配初始方案的思路如下:假设某次救援过程中某种资源的需求量经 估算为 M,我们首先选取离事故地点最近的单位 1 的参与救援,如果它的实际 可用数量 p1 小于总需求量 M,则再选取离事故地点第二近的单位 2 参与救援, 如果单位 1 和单位 2 的资源全部总和 p1+ p2 仍然小于总需求量 M,则再选取离 事故地点第三近的单位 3 参与救援,如此类推,直到满足该资源的需求为止。 在本系统中,资源调配初始方案以调配清单的方式显示(图 4.2),它主要包括两 部分内容:①提供该资源的所有救援单位;②每个救援单位可以提供的资源数 量(计划调配数量)。 图 4.2 资源调配初始方案示意图 对于初始方案中列出的各个救援单位,本系统在检索出来符合条件的救援 单位后,按照各单位离救援地点的直线距离远近的顺序排列,距离最近的单位 最先被调配,距离最远单位的最后被调配。这样做是很显然的,可以方便决策 者进行按照优先级别进行合理调配。另外,我们规定检索出来的所有单位被排 序后,他们的资源被调配的先后顺序便不会再有变化,是相对稳定的,决策者 只需按调配清单中从上到下的顺序逐个进行资源调配即可。 对于初始方案中列出的每个救援单位的计划调配数量(该单位可以提供的资\n"}
11 | {"text": "海南持续打“组合拳”力图摆脱房地产“依赖症”\n海南省在开启自由贸易港建设前后,为防止房地产市场投机炒作和摆脱经济发展对房地产业过度依赖,实施了全域限购等一系列房地产调控政策,房地产市场实现平稳运行,“一业独大”的经济结构有效改善。在自贸港建设过程中,海南继续保持房地产市场平稳健康发展的同时仍需探索创新,逐步建立完善与自贸港发展相适应的住房体系。\n海南经济发展经历过三次“大起大落”教训,其中两次与房地产业有关,分别是20世纪90年代房地产泡沫、国际旅游岛建设初期房价暴涨。近几年来,受政策利好、发展预期和生态优势等影响,海南房地产业仍然持续走高,经济对房地产业的依赖也在加深。\n据统计,房地产开发投资一度占据海南固定资产投资总额的半壁江山,到2015年达到约50.8%的峰值,房地产业税收占海南地方一般公共预算收入的四成以上。房地产长期“一业独大”,对海南经济平稳健康发展带来诸多影响。\n经济运行风险较高。海南省发展和改革委员会主任符宣朝表示,长期以来,房地产及相关产业占经济总量比重、房地产业投资占总投资比重、房地产业税收贡献明显偏大,如果遭遇房地产业市场快速变化,稳增长将面临较大风险。\n利用利好政策投机炒作惯性强。据统计,2010年1月,建设海南国际旅游岛作为国家战略公布仅5天,全省商品房交易金额达171.12亿元,超过2008年全年总额。房地产业的波动,助长了投机心态,对经济发展造成负面影响。海南省自然资源和规划厅副厅长吴开成说,海南数次政策利好都引发大肆投机炒作房地产,导致产业结构越来越畸形。\n对实体经济形成挤占效应。符宣朝认为,大量资金、土地、海域、规划指标等宝贵资源向房地产业集聚,资源虹吸效应明显,对其他产业特别是实体经济形成挤压。房地产业粗放发展与岛屿土地、岸线资源宝贵稀缺矛盾凸显。近些年海南出现的生态环保问题,不少与房地产项目有关。\n短期赚快钱但长期背包袱。房地产业短期内投资、税收、土地出让等收益可观,但低品质的房地产项目质量差,特别是低端重复建设的纯住宅类房地产项目,造成房屋闲置、资源浪费等问题,实际上加重了政府中长期负担。\n此外,房地产企业和投机资金共同抬高房价,推高了企业生产经营、市民生活成本,制约招商引才,也影响海南本地居民的获得感。\n在2018年党中央国务院宣布在海南全岛建设自由贸易试验区和中国特色自由贸易港前后,各界十分关注海南房地产是否会“重蹈覆辙”。海南房地产市场在重大政策利好下能否平稳运行,一定程度上影响着各界对自贸港建设的信心和预期。\n海南省住建厅厅长霍巨燃介绍,为防止房地产市场剧烈波动,海南打出了“两个暂停”、全域限购、加强引导管控、完善住房体系等一系列“组合拳”,促进经济结构调整和房地产业转型发展。\n一是持续加大调控力度,确保房地产市场平稳运行。霍巨燃介绍,海南近几年综合运用经济、法律和必要的行政手段,先后出台了十余项涉及房地产的调控政策。为应对部分市县房地产投资过热、商品住房库存较高问题,2016年实施“两个暂停”,即对商品住宅库存消化期超过全省平均水平的市县,暂停办理新增商品住宅及产权式酒店用地审批,暂停新建商品住宅项目规划报建审批。通过区别化的精准调控政策,全省商品住房库存加快消化、逐步恢复到合理区间。\n特别是在2018年4月海南建设自贸港消息发布后,海南实施“全域限购”等“史上最严”调控措施,2020年3月继续加码调控,本省户籍和常住居民家庭禁止购买2套(不含)以上安居型商品住房和市场化商品住房。这一系列持续加码的调控措施,确保海南房地产市场没有因为重大政策利好出现剧烈波动风险。\n二是优化考核机制,减少市县开发房地产“冲动”。海南加快实施新一轮分税制财政体制方案,把与房地产关联度最大的土地增值税、契税两个税种收入大部分集中于省级,把其他产业产生税收的大部分留给市县,倒逼市县产业转型升级。从2018年起,取消12个市县GDP、工业产值、固定资产投资考核,督促市县加大经济结构调整,降低对房地产的依赖。“这是一个非常关键和强有力的政策引导,减少了市县开发房地产的冲动。”霍巨燃说。\n三是加强规划管控,从无序开发走向有序开发。树立全省“一盘棋”思想,加强商品住宅建设总量管控和年度计划管控,“房地产从无序开发走向有序开发。”霍巨燃说。同时实行最严格的生态保护政策,生态核心区、海岸带可开发的一线土地严禁用于开发商品住宅,在生态红线区周边、工业开发区、工厂、机场、公路、铁路、污水和垃圾处理场等周边可能影响居住环境质量的区域,严格控制商品住宅开发。\n四是从严土地管理,合理控制房地产开发规模和节奏。吴开成表示,海南先后颁布了“两个暂停”、实行商品住宅用地计划管理、大幅减少直至停止供应外销商品住宅项目用地等政策,积极推动闲置土地、低效利用土地等存量国有建设用地的有序开发和盘活利用。\n五是完善住房体系,推动构建租购并举的住房制度。2020年4月,海南试点开展安居型商品住房建设,加快实施基层教师和医务人员住房保障专项计划,大力实施人才住房保障,逐步探索建立与自贸港发展相适应的住房体系。\n严格的房地产调控也带来了经济发展“阵痛期”,2018年和2019年,海南经济增速连续两年落后全国平均水平,固定资产投资也出现了持续两年的负增长。但海南省委省政府保持定力、久久为功,逐步走出调控“阵痛期”。\n房地产市场基本保持平稳。霍巨燃介绍,2018年全域限购以后,海南商品房价格得到有效控制,基本保持平稳。商品房销售面积大幅下降,由2017年2292万平方米的峰值下降至2020年的751万平方米。购房对象由省外居民为主转为省内居民和引进人才为主。\n投资结构明显优化。海南省房地产开发投资占固投总额的比重由2015年约50.8%下降至2020年的38.7%。固投连续两年负增长后在2020年实现转正,非房地产投资占投资比重为61.3%,比2015年末上升12个百分点。\n经济结构调整成效初显。国家税务总局海南省税务局负责人表示,房地产业税收占全省税收比重自2018年以来逐年降低,2018年―2020年分别为42.7%、38.6%、35.5%。同时积极引导发展壮大新经济、培育新动能,经济结构调整成效初显,全省税收中除房地产业外的第三产业税收占比自2018年来稳步提升,分别为29.6%、31.0%、34.1%。\n海南省委主要负责人表示,虽然全省房地产业投资占比以及房地产业税收占比均大幅下降,但GDP和税收仍保持稳定增长,成功走出房地产调控的阵痛期,经济结构调整方面打了一场“翻身仗”。\n霍巨燃表示,“十四五”时期,海南将发展公共租赁住房、安居型商品住房、市场化商品住房、市场化租赁住房等四类住房,构建多主体供应、多渠道保障、租购并举的住房制度。房地产调控思路仍将继续坚持“房子是用来住的、不是用来炒”的定位,压实市县主体责任,实施一城一策,保持政策的连续性、稳定性。\n记者在采访中也发现,海南有的城市调控“一刀切”做法也导致了虚构资格、价外加价、变相涨价、捂盘惜售等系列市场乱象,下一步仍需根据自贸港建设的需求和“一城一策”的要求不断完善细化调控措施,推进房地产市场持续健康发展。\n"}
12 | {"text": "图说:喻桦(左)向丁乐佳介绍他收藏的各个型号的笔记本电脑 采访对象供图 新民晚报讯(记者 金志刚)8月24日,正在搬家的联想铁粉喻桦听到门铃响起,一位特殊“快递员”上门:联想集团华东大区总经理丁乐佳送来了喻桦订购的联想小新14笔记本。8月20日至28日,联想启动了以“谢谢你”为主题的“联想828超级购物节”,联想中国的管理层为老用户送货表示对用户的支持和感谢,而喻桦绝对称得上是骨灰级铁粉。 在家中,喻桦向丁乐佳展示了他的藏品,其中包括54台ThinkPad笔记本和17台MOTO。丁乐佳说,喻桦收藏的有些机型在联想的博物馆都没见过,第一次到深度粉丝的家里看藏品真是太有意思了。喻桦还向丁乐佳特别介绍了ThinkPad S3010周年纪念机、ThinkPad25周年纪念机等藏品,讲述了藏品背后的有趣故事。 作为ThinkPad黑匠全国粉丝团发起者,喻桦追随David Hill,翻译了《ThinkPad灵魂与精髓》,随后他的中文版本,作为ThinkPad 25周年纪念机产品包装中的小册子全球发行。 丁乐佳认为,有那么忠实的粉丝,企业更应该做好产品和服务。今年是联想成立35周年,特地把购物节主题定为朴素的“谢谢你”,用拜访用户的方式感谢用户。 一周前,联想集团19/20财年第一财季业绩沟通会上,联想集团执行副总裁兼中国区总裁刘军再次强调以客户为中心转型的重要性,“我们的目标简单来讲就是要拼命拉近与客户的关系,特别是希望能够直接to C,同时改善服务。” 根据最新财报数据,无论是全球还是在中国,联想都连续占据PC市场份额第一,第一财季联想在中国的市场份额高达38.4%,同比上升0.3%,在中国整体PC市场下滑的大环境下逆势上涨。刘军认为,成绩的背后,是联想坚持以客户为中心的转型,推动业务模式的升级变革更贴近用户所取得的初步成效。"}
13 | {"text": "建筑扣件冷却也是热处理工艺过程中不可缺少的步骤,冷却方法因工艺不同而不同,主要是控制冷却速度。一般退火的冷却速度 慢,正火的冷却速度较快,淬火的冷却速度 快。但还因钢种不同而有不同的要求,例如空硬钢就可以用正火一样的冷却速度进行淬硬。\n建筑扣件抗滑式建筑扣件属于建筑机械零件领域。本建筑扣件由两个分扣件组成,每个分扣件中的下扣件小端与活节螺栓连接,大端与带有豁口和止推面的上扣件连接,两个分扣件之间碾铆联接,并以任意角度旋转。本型号建筑扣件具有实质性特点和显着进步,使扣件减少零件数,减低成本,而且因是自身材料翻边厚度大于空心铆钉厚度,故增加了抗拉强度,抗扭矩刚性大大提高,同传统的建筑扣件相比, 具 ,可靠,本建筑扣件的结构强度大大优于传统的建筑扣件。\n淬火后在室温停留:淬火后, 要使套圈内外均匀冷至室温后进行冷处理,否则容易开裂,冷至室温后马上冷处理(一般不超过30min),否则会中止奥氏体向马氏体的转变。\n冷处理温度:冷处理的温度主要根据钢的马氏体转变终止温度Mf,另外还要考虑冷处理对机械性能的影响及工艺性等因素。\n对于GCr15钢,冷处理选用-70℃;精度要求不甚高的套圈或设备有限制时,冷处理温度可选为-40~-70℃;超建筑扣件,可在-70℃~-80℃之间进行冷处理。过冷的温度影响建筑扣件冲击疲劳和接触寿命。\n冷处理保温:虽然大量马氏体的转变是在冷到 温度倾刻间完成的,但为使一批套圈表面与心部都均匀达到冷处理温度,需要 的保温时间,一般为1~1。5h。\n冷处理后的回火:套圈冷处理后放在空气中,其温度缓慢升至室温后及时进行回火。温升不能太快,否则容易开裂;回火及时,否则套圈内部较大的残余应力会导致套圈开裂,一般不超过2h。\n冷处理的作用:建筑扣件对尺寸稳定性要求较高;套圈淬火(尤其是分级淬火)后,内部组织仍保留较多的残余奥氏体,这种残余奥氏体是不稳定的组织,在储存和使用建筑扣件过程中,会不断地发生变化,从而改变建筑扣件的精度。为此采用冷处理工艺,它能减少组织中的残余奥氏体,稍微提高零件的硬度。\n对于建筑扣件和抗滑式建筑扣件的使用和特点,需要注意的事项很多,但是针对目前的国内外需求市场,这两种扣件的需求将会迎来一个新的时期。\n金属热处理工艺大体可分为整体热处理、表面热处理、局部热处理和化学热处理等。根据加热介质、加热温度和冷却方法的不同,每一大类又可区分为若干不同的热处理工艺。同一种金属采用不同的热处理工艺,可获得不同的组织,从而具有不同的性能。钢铁是工业上应用 广的金属,而且钢铁显微组织也 为复杂,因此钢铁热处理工艺种类繁多。\n"}
14 | {"text": "设置代理出价:什么是代理出价?\n在上面的出价栏里输入高于当前最低出价的价格。\n最好是加价幅度倍数,高出部分自动设置为代理价。\n所有竞价的域名只有这一次机会,一旦竞价结束将不可能还有机会了,如果你喜欢此域名就快些出手吧,一个好域名是非常难得请不要错过机会!\n1、出价需冻结出价金额的20%作为保证金,出价被超出时自动解冻。\n2、竞价结束前的5分钟内,为了保证公平,如有新的出价,则自动延时0-10分钟,直至无新的出价为止。\n3、由于实际结束时间有波动,最后3分钟出价不能确保有效,请务必在最后3分钟前出价。\n4、外部出价说明:是外部平台用户的出价。外部出价有时未按加价幅度出价(或出相同价却领先),这是由于外部平台存在代理价造成的,属正常现象。\n5、代理出价:当您的实际出价 大于 当时所需最低出价时,系统仍然会以最低出价替您报价,如无人竞价,则您以最低出价得标;如有人出价,系统会自动替您竞价,直至您的代理价被超出。\n6、如何设置代理价:直接出价,系统只会以加价幅度替您加价,高出部分自动设置为代理价。\n7、剩余时间显示:“即将结束”表示内部结束,但是外部还未结束,外部可能会有新的出价,请保持关注,直至结束。\n8、域名竞价的价格请以本站出价时显示的为准,其它网站显示的并异步本站。\n得标费用:\n1、域名得标后,系统将自动从您的可用余额中扣除相应款项。[余额不足的,请在72小时内补齐,否则按违约处理!]\n2、费用支付完毕后,域名自动过户到您的帐户,您可以在本站管理修改解析域名;[域名注册满60天可以自由转出]\n任何系统都不可能100%完美,我们尽可能降低故障率,控制在万分之一以内。如果由于本站自身问题的原因,导致用户该拿到而没有拿到域名,本站将表示道歉,并赔偿(国际域名人民币1000元,国内cn域名人民币200元)。\n1、本站竞价的域名都是代理海外或国内其它注册商,非本站发起。\n2、如因不可抗拒的因素导致域名竞价失败的(如服务器断电, 网络断网,服务器受到攻击、竞价发起商原因不能交付域名、竞价发起商不能连通等情况),本站不承担任何经济及法律责任;\n3、由于竞价域名基本都是过期删除的域名,所以我们无法确定域名是否被第三方软件拦截或者被国家防火墙拦截,竞价前务必自行判断,如由于第三方拦截导致的问题,本站不承担任何经济以及法律责任!\n4、如因竞价发起商问题,导致得标的域名无法正常交付,我们将不承担责任,但已扣款项会退还给您,如需提现并不收提现手续费。\n5、因代竞价平台的特殊性,本站竞价域名一律不准违约。请在自己的合理预算内冷静、理性出价。\n6、违约处理:冻结您的帐户以及帐户下所有域名,如7天内未联系本站,本站可有权公开拍卖您帐户下的所有域名,已扣费用不退!\n7、竞价得标的域名请不要用于制作钓鱼诈骗色情等非法网站,发现一律封锁域名,封锁帐户,费用不退,并且将违法帐户信息上报公安部门,后果自负,谢谢合作!\n8、本站不承担由域名竞价所引起的一切经济及法律责任;\n9、如不同意本规则,请勿出价,一旦出价无法撤销,并表示您已同意上述规则!"}
15 | {"text": "本文摘要:目录什么是井喷造成井喷的原因有哪些天然气井喷事故井喷的原因1.什么是井喷井喷,顾名思义,形象地讲,就如同打井打到承压水,\n井喷,顾名思义,形象地讲,就如同打井打到承压水,一下子往上高喷而出。指的是某种事物在某一时间频繁发生、或达到高潮或火爆状态的一种现象。“井喷”,最初来源于石油开采过程中而引入的词语。是石油或石油气开采中非常忌讳的意外事故,钻井时要把泥浆注入井管来平衡地下地层对油气的压力。但是当勘测时对地下压力测试不准或注入的泥浆密度太低或出现地层压力突然变大等情况时,井管中的油或气喷出地面或流入井内的其他地层就发生了井喷,井喷往往伴随着有毒气体的着火,造成对环境和人较大的危害。扩展资料:井喷在股市里面是行话:股市长期受某种利空因素的影响,股价低靡或长期非理性地下跌,众多大小投资者被套或不愿介入——一但这种利空因素被去除,被非理性低估股价的股票会被大小投资者在第一时间集中介入,致使股市暴涨——这就是股市井喷。汽车市场中的所指:指买汽车的人特别多,市场达到了一个空前好的状态。参考资料来源:\n. 一级井控:利用钻井液密度,建立井内压力平衡。 二级井控:发生溢流后,利用井口防喷器憋回压后压井,恢复井内压力平衡。 三级井控:井喷后的处理和压力控制。\n井喷事故指一种地层中流体喷出地面或流入井内其他地层的现象,大多发生在开采石油天然气的现场。引起井喷的原因有多种:地层压力掌握不准、泥浆密度偏低、井内泥浆液柱高度降低;起钻抽吸,以及其他不当措施等。井喷有的是正常现象,但出现井喷事故,天然气喷出后如遇火星,会发生燃烧,因此非常危险。常见的抢险方法是将密度大的重晶石泥浆灌到井里,以增加压力,止住井喷继续发生。扩展资料:预防井喷火灾的主要措施是:1、钻至油气层之前,检查泥浆性能,使比 重符合设计要求; 同时准备一定数量的备用 泥浆和加重剂。2、严格控制火源,井场禁 止吸烟,不准动用明火;必须明火作业时,应 办理动火审批手续并采取可靠的安全措施。3、柴油机排气管要每半月清除一次积炭。4、 采用电驱动钻井时,要按电气规程安装 电气设备和线路,采取必要的继电保护措施, 防止短路,避免超负荷运行。5、冬季井场 的锅炉应安装在距井口50米以外的侧风方 向。6、钻至油气层前,应装好防喷装置,并 应使防喷器蕊子与钻杆直径相吻合; 开关要 灵活好用,阀门手轮与井架底座边缘距离不 应小于5米。7、发生井喷,应立即停下柴 油机、切断电源、禁止机动车辆进入井场。参考资料来源:\n"}
16 | {"text": "1.友爱的:该起床了,别睡了,快变小猪了,哈哈哈哈哈~~,我想你了,你想我吗?\n2.友爱的你累吗?昨天晚上马不停蹄地在我脑海里跑了一整夜,可真辛苦你了。\n3.给我一个悄悄的早安吻。\n4.早安!夜里的星星有没有我啊?\n5.早安!看着天边的红日蹦出来一次又一次,盼望你的一天也如刚升起的红日一般。\n6.昨天做了一个梦,上帝问我“你爱谁”我说我爱她,死后上帝又问“你爱谁”我说我的答案永不变。\n7.太阳要晒背,你怎么还睡?\n8.天亮了吧,闹铃响了吧,极不情愿地起床了吧,我的问候及时赶到了吧,快乐了吧,那就笑笑吧。友爱的朋友,早上好,愿你今天有个好心情!\n9.除了爱你…我想不出能使我继续活着的理由…我的爱人,早上好哦。\n10.早上,看着你(你)的眼我看见了大海蓝天;更看到了漂亮的将来!\n11.春风如梦风过无痕,只为心的思念,遥寄一份浓浓的祝福。\n12.蓝天吻着海洋,海洋偎着蓝天,我把祝福写在蓝天碧波上。\n13.真诚的祝福带给远方的你,愿你事事顺心,欢乐相随。\n14.在我心灵的百花园里,采集金色的鲜花,我把最鲜艳的一朵给你,作为我对你的问候。你好!\n"}
17 | {"text": "● 系统集成 展望计算机网络公司专业从事各种操作平台包括Novell、 Windows NT、UNIX等的Intranet(局域网)构建和维护,并提供网络设计→综合布线→系统集成→软件开发→运作维护等一条龙服务。主要服务对象包括各中小型企业、政府机关、各大中小院校、酒店宾馆、医院、网吧、商场娱乐等行业部门。\n● 软件开发 由扬州展望计算机网络公司和上海恒星软件公司研制开发的各种MIS系统(信息管理系统),如中小型企业信息管理系统、院校管理信息系统(MisSchool)、酒店管理系统(MisHotel)、医院管理信息系统(MisHospital)、商场POS收银系统等大型管理软件,经过无数次实践论证,得到了用户的充分肯定和认可。另外,展望计算机网络公司还可根据客户的需求,度身订做各种应用软件。\n● Internet信息技术服务 为加快苏北地区国际互联网建设进程,展望计算机网络公司致力于INTERNET信息技术在商业中的推广和应用(如电子商务、互联网广告等),给您一个无限广阔的发展空间,让您的企业充分利用Internet的优势,掌握无穷信息,把握无限商机!\n● 其它 展望计算机网络公司还承接智能卡IC卡工程、视频监控、多媒体制作等项目。\n扬州展望目前拥有跨洋网([URL]、润扬网([URL]、评介网([URL]。跨洋网目前主要介绍公司的现行状况;润扬网将用于介绍扬州本地综合信息为主的大型网站,将下设扬州风情、人文地理、维扬名菜、扬州风景、扬州诗词、电脑行情等栏目;评介网将用于开展B To C式的电子商务,浏览评介网,可以在线查阅网站下浏览者对于商品的评介信息,以利于对浏览的商品有正确的认识,同时也可以将浏览对商品的评介信息进行在线发布。通过三网,扬州展望将在网上形成互为补充、共同发展的网站群!为以后公司在互联网上的发展奠定坚实的基础!\n扬州展望目前拥有员工十五人,其中大专以上学历11人,本科以上学历2人,占公司员工数的87%;并且都有多年从事IT行业的经验。公司下设技术部、客户服务部、市场部、总经理办公室、财务部等。"}
18 | {"text": "您好,欢迎登陆天津太平洋化学制药有限公司官网!\n天津太平洋化学制药有限公司始建于2001年。位于天津市津南区开发区。占地39000多平方米。建筑面积9259.55平方米。\n公司现生产经营多种原料药品种,配备有先进的生产设备及检验仪器,由高素质的人员从事科研、开发、技术、销售等工作。从而达到对生产和质量进行严格的科学管理和良好的售后服务。以GMP规范为标准,遵循“更科学、更严谨、更规范一—对生命负责”的公司理念和宗旨,严格管理,确保质量。不断提高拳头产品的竞争力,努力使企业各项工作取得更大发展。\n公司自创立之日起 就始终坚持以市场为导向,质量为保证,科技为先导,严格按照市场经济的规律,来规范和完善企业的行为。不断倾听来自于客户的声音。从根本上保证了市场决策和运作的正确性、有效性、合理性。公司以不断推新的产品和良好质量为”纲” 以完善的销售服务为“目”以原料销售为媒介;广交各界友人,共同进步、共同发展"}
19 | {"text": "电源适配器相信大家对它都比较清楚,因为家庭中很多电器设备都需要用到,但是说到它的详细参数有哪些,很多人就不知道了,下面就跟随小编一起来了解下吧!\n怎么判断电池是否充满电了?\n手机是我们生活中离不开的东西,当然手机充电器是必不可少的,但是怎么判断电池是否充满电了呢?这些是大部分人心里的疑问,下面就跟随充电器厂家一起来了解下吧!\n电源适配器可以用在哪些行业?\n电源适配器对于咱们一定不会陌生,因为只要用到笔记本电脑,就需要用到电源适配器。但电源适配器并不仅仅只是运用在笔记本电脑中,它的运用范围是十分广泛的,下面就跟随小编一起来了解下它可以用在哪些行业吧!\n电源适配器的几个常见问题!\n电源适配器在我们的生活中起到了不可缺少的作用,他可能在明面上不容易被大家发现,但是家用电器中都离不开它的身影,今天小编就来为大家介绍下电源适配器的几个常见问题!一起来看看吧!\n"}
20 | {"text": "暑假即将结束,为了调整好家长、学生的心态,迎接疫情防控常态化背景下的新学年,23日,福州市教育局指导下辖的未成年人心理健康辅导机构,发布了秋季开学心理调适建议书。\n给家长的建议是从“心”开始:为孩子创设收心的环境,可帮助孩子逐步调节好生物钟;与孩子进行情感交流,可选择孩子感兴趣的话题聊,多站在孩子的立场考虑问题;激活学习内驱力,肯定孩子的进步,正确引领孩子的求知欲;协商电子产品使用,不简单、粗暴地强制阻止,最好是以身作则,为孩子树好榜样;注重学习防内卷,尽量了解掌握教育政策规定,少一些盲目“赢在起跑线上”的心态,多一些规避“倒在终点线上”的实招。\n给学生的建议则分初中、高中、中职三个学段具体提出:提前进入开学状态,恢复作息规律,适度使用网络、手机,自主培养良习;规范学习生活,开学后,培养良好的学习习惯,学会自我管理。特别注意的是,学生需用适合的方式表达自己的感受,及时合理宣泄情绪,避免情绪积压;不沾染陋习,不懈怠、不沉沦;积极、开放、建设性地与老师、同学交流,学会换位思考,理解尊重他人;正确应对青春期生理心理变化,主动与父母沟通等。(记者庄严)\n"}
21 | {"text": "每个人都希望生活井井有条,然而理想很美好,现实很烦心,整理收纳却困扰着不少人。看似简单的收纳,如今催生了一门新职业:整理收纳师。\n新品略关注到,这两天有一条“你会聘请整理收纳师吗?”微博热搜线点,该线万。\n原来是在今年人社部公布的新职业中,“家政服务员”职业下新增的“整理收纳师”工种受到了广泛关注。新华网发起了上述微博话题,引发了网友热议。\n相信很多人不是第一次听说整理收纳师,此前就多次登上热搜,被媒体经常报道,新品略记得央视财经也曾报道过这一职业。\n收纳整理师最开始被称为衣橱整理师,是通过对客户色彩风格、诊断,进而有针对性地为顾客上门整理衣橱。\n后来整理收纳师开始担当起专业顾问角色,比如陪同客户购买适合他们的衣物和居家物品。\n当给客户面临取舍哪些物品陷入纠结时,整理收纳师需要用专业见解引导和帮助客户做出“断舍离”的决策。\n整理收纳师的专业定义是指,通过与客户间的深度交流,为客户提供居家整理、收纳方案和服务的专业人士。\n整理收纳师首先要对可供整理收纳的地方进行规划,需要专业的空间规划知识和能力。其次,需要对收纳整理的物品进行识别和分类,要求具有极佳的逻辑思维能力,还要专门清楚整理收纳器具需要如何恰当使用,既保持整洁,又便于寻找。\n新品略了解到,国内大城市整理服务定价是400元一小时,活动体验价为200元一小时。从单价来看,收纳师服务报价高过家政服务。而别墅新房收纳业务一单可能达到两三万元。如果陪同购物按小时计费,每小时价格在200~400元不等。\n按此简单推算,一名整理收纳师每个月平均三四次陪同购物、一两次整理衣橱,再加上一个季度一次的常年顾客,月收入即可轻松突破万元。\n根据新浪乐居财经发布的《2020中国整理行业白皮书》调查显示,85%的中国人不懂空间规划,他们当中91%的人患有囤积症,舍不得扔衣服;83%的人衣柜衣物数超过500件;75%的人浪费大量储物空间。\n可以看出许多人受到整理收纳困扰,有明显的市场需求,从市场经济学角度来说,有需求就会有供给。\n在新品略看来,整理收纳师之所以日益被更多人所接受,主要原因体现在以下三个方面。\n在现代社会,人们工作和生活节奏都较快,特别是在一二线城市或者新一线城市,在快节奏生活环境下,人们有很强的时间观念。\n整理收纳是许多人的生活方式刚需,通过请专业整理收纳师,能在短时间内将家整理得井井有条,可以节省大量的时间,让时间去创造更大价值,花更多时间去享受生活。\n很多人在生活中收拾整理家都会亲力亲为,可如今随着人们生活水平的提高,生活观念发生明显改变,对生活品质也有了更高要求。\n整理衣物就是整理心情,就是整理生活品质,整理收纳师看似是一门简单的工作,其实很专业,通过专业整理收纳能明显改变家中形象,能切感受到生活的改变,感受到生活品质的提高。\n现在有很多年轻人最开始接受整理收纳师只是抱着试一试,有着好奇心的心态,然而当真正看到专业整理收纳师和工作成果时,都会惊叹不已。\n新品略观察到,不少年轻消费者人群对生活品质要求越来越高,而且他们有足够的支付能力,愿意聘请各类专业人员帮助或给自己的生活提出专业意见。\n美国《商业评论》杂志将整理收纳行业定义为“朝阳行业”,中国的整理收纳行业被市场各方所看好。\n根据中研普华发布的《2020整理收纳白皮书》显示,截至2020年,整理收纳行业年产值已达1000亿元,成为极具潜力的新蓝海。\n天眼查数据显示,我国已有超130家整理收纳相关企业,近年来企业注册呈快速增长之势,年度注册增速保持在33%以上,仅2020年就新增30多家,年注册增速达到102.7%。\n数据显示,目前全国接受过职业整理收纳师培训的人数只有万余人,2019年~2020年全国新增职业整理师2200余人,增长势头强劲,行业未来两年对整理收纳师的岗位需求将近两万人。\n整理收纳行业的发展也同样为业务培训、出单服务、收纳用品销售、家具设计及生活服务互联网平台等带来市场机遇。\n目前整理收纳行业在欧美和日本已经十分成熟,进入中国市场也仅有10多年时间,目前中国的整理收纳行业处于发展初级阶段,市场尚需规范标准,市场规范化仍有欠缺,目前还没有行业统一规定和规范,行业参与各方正积极推进整理收纳行业的标准化,推动市场朝着规范方向发展。\n从未来发展趋势来看,有市场研究机构预计中国整理收纳行业未来每年增速在20%~30%左右,行业将会加速发展,市场前景可期。\n职业整理收纳师从小众走向大众,反映的是人们生活水平的不断提高和对美好生活幸福的追求,相信未来会有越来越多的新兴职业出现,服务大众,服务生活。"}
22 | {"text": "火力发电是现代社会电力发展的主力军,火电仍占领电力的大部分市场,近几年电力发展滞后经济发展,全国增添了大量的火电厂,但火电技术必须不断提高发展,才能适应和谐社会的要求。\n输煤系统作为电厂外围尤为重要的系统,一直为电厂锅炉提供燃料,是电厂能否运行的重要保证。在传统模式中,输煤系统有自己独立的控制室,有且仅有在这个控制室中才能实现对整个系统的实时监控,其局限性可想而知。整条输煤传送线路不仅占地面积大、输送距离远,还有设备高低落差的限制,传统的二维组态画面已经不能将其清晰直观的展现出来。\n现在通过使用图扑 Web 组态软件,运行人员和系统工程师可以在任何有网络的地方通过手机、平板电脑和普通 PC 机就可以实现对整个系统的实时监控,方便快捷,大大提高了工作的灵活性,也为整个系统的监控、维护和紧急维修提供了更加灵活方便的新平台。\n使用三维组态画面用和网络技术将系统运行过程中的各种要素和整套系统的实时运行状况呈现给每一个系统维护人员。三维可视化流程清晰准确立体的展现出整个输煤系统工作流程,详细到每一台设备的当前工作状态。\n做到实时监控相关数据,不仅能及时发现已经发生的故障,在三维组态画面中能非常准确直观的展现出来。也能及时发现并提醒可能会出现的故障,在系统运行期间迅速有效地处理好问题以免影响到其他设备系统的正常工作运行。并且可通过远程监控屏幕直接调整系统进入手动或自动模式,调控皮带机等设备的工作状态,真正做到远程监控,自我调整,精准控制。\n相较于传统的上位机监控体系具有以下优势:\n打破了传统上位机监控模式的限制,实现的随时随地对系统运行的精准把控,大大提高了人力资源的优化。\n动态立体展示,使数据实时可以被感知,促进管理决策合理,确保运行精准高效。\n自动完成数据采集,及时提出故障报警,进行针对性维护,提升设备的科技含量和使用寿命。不仅改变了电厂管理模式,也为用户提供了最佳的工作体验。\n燃煤的输送只是火电厂系统的一个分支,火电厂还包括一些辅助生产系统如:水的化学处理系统、灰浆的排放系统等等。这些系统与主系统协调工作,相互配合完成电能的生产任务。\n现代化的火电厂,已经开始采用先进的计算机分散控制系统。为保证设备的正常运转,配备大量的仪表,以此来监管设备的运行状况,同时还设有自动控制装置,方便及时调节。这些控制系统可以对整个生产过程进行控制和自动调节,根据不同情况协调各设备的工作状况,使整个电厂的自动化水平达到了新的高度。在此,图扑 Web 组态软件将传统上位机监控体系与网络技术相结合,研发出符合未来工业发展趋势的新型上位机监控软件。紧跟工业4.0发展的脚步,为智能工业体系建造新的里程碑!"}
23 | {"text": "所以互联网行业里有一句话,说是在互联网上,只有老大没有老二,虽然说的有点绝对,但是不无道理可以说现在是一个品牌泛滥的年代。\n众所周知,互联网颠覆了人们的生活、颠覆了传统行业,同样也颠覆了阀门产业的营销行为。在互联网时代之下,有品牌也不一定卖得好。因为互联网打破了地域限制消除了各种信息不对称。在传统,有各种地方知名阀门品牌,但是有了互联网后,大家发现所有的同类品牌都是在同一平台竞争,而基于第一法则大部分用户只会选择行业里有限的几个知名阀门品牌。\n在这种情况下粉丝经济的出现是偶然,也是必然是顺应时代的产物在互联网时代下,光有品牌不行你的品牌还要有粉丝。在当下,只有拥有粉丝的企业,才能活的长久。有庞大的粉丝人群自然也蕴涵着巨大的经济能量,企业营造一个健康的粉丝文化,能撬动一个潜力巨大的粉丝产业,形成一种新兴的粉丝经济。如何顺应膨胀的市场经济体系,通过粉丝经济带动企业效益,一直萦绕在企业主脑海中。而互联网的快速发展,颠覆了传统企业的行销力模式,究竟如何玩转粉丝经济才不会走弯路呢?\n目前很多阀门企业把粉丝经济理解成了就是在微信建个公众号,然后拉人和发广告,把这么一个先进和高大上的东西变成了拉客经济小广告经济。一些企业为了让人关注自己的公众号穷尽了脑汁,关注后便是日日小广告伺候。\n要玩好粉丝经济,首先要明白为什么要玩粉丝经济,其本质是什么。这就是所谓的道和术的问题,微信也好、微博也罢,没有正确的方式是不一定能发挥很好的作用的。\n要明白这个问题,先得弄明白网络行销力的本质是什么。其实网络行销力也好、传统行销力也罢,亦或现在流行的移动行销力,其本质都是行销,网络移动只是渠道行销力。那行销的本质是什么呢?行销追求的成果是利润,应该说所有的阀门企业做的一切工作基本上都是为了追求利润,企业没有利润,其它都是白扯。\n而行销力追求的目标是品牌,一个企业要生存,一定要有竞争力,而企业最大的竞争力是品牌。从用户的心理学角度来说,品牌会对用户的购买决策造成非常重要的影响。当两个产品的条件差不多时,比如说价钱差不多,那用户往往会选择第一品牌。当有了品牌之后,再做行销力是为了维护品牌。\n在如今这种注意力的经济时代,一个阀门企业受尊重的品牌价值往往是用物质无法衡量的,这是一笔无形的资产。这不仅仅意味着将要得到用户的心,而且还要得到用户的认同。在如今的功利性时代,尤其是在城市,没有人会无缘无故地说一个人的好话。人们没有太多时间主动传播信息,要想获得市场口碑必须有意为之,要主动传播,雁过留声,品牌的美誉度要靠自己建立,只有通过品牌建设与传播才能深入人心持久恒效才能可持续生存与发展。\n"}
24 | {"text": "农学考研听起来很多同学就已经选择望而却步了,传统印象中这个老祖宗从事了几千年的工作,如果有发展,有前景,怎么还轮得到工业革命的革新?跨考教育郭锐老师要告诉你,你大错特错了!\n首先,我们先来看看农学都包括哪些一级学科以及一级学科里有哪些专业!\n一级学科分为:作物学、园艺学、农业资源利用、植物保护、畜牧学、兽医学、林学、水产。从一级学科的命名我们可以看出,基本包括了你所了解的农业(俗称种地)以及你不清楚的植物保护,林学和听起来很有美感的园艺学。\n一级学科里包括的专业有:作物栽培学与耕作学、作物遗传育种、果树学、蔬菜学、茶学、土壤学、植物营养学、动物营养与饲料科学、草业科学、特种经济动物饲养(含蚕、蜂等)、林木遗传育种、森林经理学、园林植物与观赏园艺等26个专业。\n从这一点看,就打破了你所认为的老祖宗从事千年的工作,毕竟老祖宗不会通过有数据支持和实验室分析进行养殖和耕种。\n其次,农学不是院校想开设就有能力开设的,农业人才并没有你想象中的那么充足。\n从开设院校之少就可以看出农业人才的紧缺。\n再次,农学录取分数线在13大门类中属中下水平。\n相较于经济学、法学动辄350、360甚至更高的录取分数线,农学就算是自主命题的国内顶尖院校,录取分数最高的哈工大也没有超过330分,近2、3年这些院校的录取分数更是在300分左右。\n最后,也是最重要的,国家政策每一年都在农业方面有新的倾向性。\n持续到2020年的全国农业现代化规划,《关于加强耕地保护和改进占补平衡的意见》、在全国开展特色农产品优势区创建工作、建设“三区”“三园”加“一体”、“三推三提”促畜牧业升级、新型职业农民培育网上开始申报、商务部着力促进农村电商发展、我国首次明确扶持新型农业经营主体发展等等,无一不告诉我们久居“冷宫”的农学真的开始“吃香”了!\n从各种管乐大学毕业生人才招聘会的报道中,我们可以发现农学专业人才成为亮点,农业类人才逐渐成为职场新宠。未来中国所需的农业科技人才可能要达到几百万。现代农业的概念远远超过人们的传统所认为的,种菜种粮、养猪养鸡的范畴,已经涵概生态,营养,动植物检疫,食品加工、克隆、花卉、草坪、农药、化肥、农产品的国际贸易、农村社会的发展、规划、开发等诸多方面的内容。进期,农业人才招聘会频频举行,农业人才走势上扬,一向相对冷门的农业类人才逐渐成为职场新宠。\n而且随着国内绿色景观神态的逐渐重视和深度开发、农业、园林、绿化、环保,园林/园艺景观设计及建筑规划类人才成为城市建设的新宠,也是当前人才市场供求的热点;绿色之旅和以人文为主题的农家之旅成为当今旅游的业的时尚,与园林,环保形成了就业链;一向相对冷门的农业人才近两年来也备受社会的关注。跨考教育郭锐老师告诉大家,近年来随着农村经济的持续发展,需要越来越多的农业科技方面的人才,农学作为培养农业生产很研究方面的高级人才的学科得到越来越多的重视。"}
25 | {"text": "1.性能与特点:MBY系列减速器采用了现代齿轮设计制造术,吸取了国内外同类产品的优点,总结了国内设计制造同类产品的经验,根据水泥等行业使用特点,专门精心设计用于水泥磨、煤磨等用途的边缘传动机减速器。\nMBY系列减速器采用单级减速、带专用油站、齿轮全部为硬齿面,精度达6级( GB10095 -88)以上,与国内外同类产品相比,具有体积小、重量轻、外形简洁大方、操作简单、维修方便、可靠,使用寿命长等特点,广泛应用于新厂选型及老厂技术改造和设备的更新换代。\n主要用于水泥磨、煤磨等边缘传动机减速器。\n减速器高速轴转速不大于1000r/min。\n齿轮圆周速度不大于20m/s允许正反运转。\n减速器工作环境温度为_40C+40C,低于0C时,启动前应预热润滑油,高于40C时应采取隔热和制冷措施。"}
26 | {"text": "硬齿面减速器主要包括平行轴系列和垂直轴系列.平行轴减速器是按国家标准 (JB/T8853—200。1)生产,产品经优化设计。具有国际八十年代先进水平,它主要包括ZDY(单级)、ZLY(两级)、ZSY(3级)和ZFY(四级)四大系列,垂直轴减速器是按国家标准(’B/T9002—1999)生产.用于输入轴与输出轴呈垂直方向布置的传动装置.它主要包括DBY、DCY和DFY三大系列;性能特点\n(1)中-心距.公称传动比等主要参数均经优化设计,主要零、部件—里换性好(2)齿轮均采用良好合金钢经渗碳、淬火而成.齿面硬度达54~62HRC(3)体积小、重量轻、精度高、承载能力大、效率高,寿命长,可靠性高、传动平稳、噪声低。\n(4)一般采用油池润滑.自然冷-却,当热功率不能满足时,可采用循环油涧滑或风扇。冷-却盘管冷-却。"}
27 | {"text": "互联网的存在给了传统行业带来许多的机会像制造业打破了空间地域的限制让大量的信息流动及沟通成为可能也帮助制造业成为一个互联网+模式。链动通过互联网成为“互联网+制造业”模式公司将生产物流销售等链接起来为消费创造更多的价值。\n链动的“互联网+制造业”模式公司通过互联网打造用户聚合平台、多元社交平台等可以使得生产者无限接近消费者并收集到消费者的直接信息进行分析快速满足消费者的个性化需求实现紧密联系高效协作的生态系统。同时也打破了原有的固化生产线和生产体系使得以消费者需求为中心的个性化研发、生产、服务与工厂大规模生产不再割裂和对立而是可以兼顾发展、相辅相成。\n“互联网+制造业”模式公司是互联网+下产生的使得消费者直链生产者减少中间的差价也减少了许多资源的浪费同时也可以让企业走在消费者的前面为消费者着想优先解决消费者的个性化定制满足消费者的消费升级的需求。\n互联网+下的模式让传统企业互联网化增强了市场的公开性与透明性为制造为带来了新的活力进而加大制造业与消费者的连接实现大规模个性化定制的生活也减少了库存的压力。\n互联网+能整合各方优势资源形成跨领域、网络化的协同创新平台实现关键核心技术攻关。“互联网+制造业”模式公司利用互联网建立了创新网络实现信息共享和协同创新的机会为企业和消费者带来更多的价值。\n“焊材网”微信公众平台在此背景下诞生平台创始人张总介绍作为一套工具“焊材网”是集企业管理软件、施工管理、、机械配件、机械整套设备、材料供应商平台、制作社交等功能于一体的协同平台;作为一种方法“焊材网”有企业实践经验、信息化解决方案和互联网转型之道是企业转型升级好帮手。整合优质焊材企业资源形成资源互补、强强联合更好的满足消费者焊材消费需求。也为消费者提供了全面的焊材信息服务使家装真正成为一种简单、透明的消费用户只需要通过信息对比找到相应的产品和服务即可。\n“焊材网”创始人张总说:“互联网化发展已经是一种行业的必然趋势对于传统制造业来说不是你要不要接受的问题而是你何时接受的问题只有那些勇于面对互联网趋势并成功利用的企业才能在未来竞争中赢得一席之地。“焊材网”作为传统制造行业互联网化的倡导者正在迅速成长!”\n目前“焊材网”微信公众平台已全面上线平台年中大优惠申请入驻两年的商户可送会员半年申请入驻一年的商户可送会员三个月名额有限欢迎做模具行业的企业以及个人积极入驻加盟!\n"}
28 | {"text": "近年来,国家通过组织开展药品集中采购,明显降低了药品价格,减少了企业交易成本,从而引导医院规范用药,让百姓得到了实惠。同时,国家越来越重视新药研发,让新药研发和上市成为了医药行业热点。这意味着未来将有越来越多的医药科技成果转化为生产力,更好地服务于国计民生。而在药品上市之前,CRO(合同研究组织)则起到了至关重要的作用。\n成立于2002年的北京卓越未来国际医药科技发展有限公司(北京卓越未来),是国内最早的临床CRO之一。公司秉承“稳健、务实、严谨”的科学态度,致力于为广大制药企业提供。公司通过多年的发展,在业内建立了良好的口碑和信誉。\n截至目前,北京卓越未来已承接新药、器械及上市后药品的临床研究项目1000余项涉及呼吸、肿瘤、骨科、心血箮、儿科、精神、消化、麻醉等多个领域专业几乎涵盖整个医学细分学科。CRO项目承接创新药近50项SMO项目承接创新药近150项;承接项目涵盖化药、中药、生物药。\n临床研究是新药上市之前的一项重要程序,也是医药企业最重视的方面之一。北京卓越未来将临床研究细分为224个工序节点,在项目管理、专业技术能力等方面不断积累、提升,建立了严格的质量控制体系和操作规范,严格把控项目流程与质量。同时引进先进的甲骨文项目管理系统,建立系统的培训体系,实行四级职能和区域化精细运营,真正达到项目全程精细化管理,目前已通过了 ISO9001质量体系认证。\n经近20年的发展公司不但从临床CRO业务扩展到SMO及临床前CRO业务同时在处方筛选、工艺验证、新药申报立项、创新药早期介入、临床前硏究、临床试验、注册申报等十多个药物研发阶段和环节都形成了独有的特色,部分关键技术达到国内行业领先水平。从而进一步保证为客户提供一站式和专业化的服务。\n北京卓越未来凭借领域内的深耕,累积了丰富的专业资源和强大的技术实力。凭借经验丰富的专家团队、标准规范的业务流程规范、严格完备的质控体系让公司形成了稳定强大的项目管理及执行优势目前已成长为业内公认的诚信度和专业性兼备的国内优秀临床研究CRO公司之一,并与国内众多医药企业建立并保持良好的合作关系。\n截至2020年,公司已连续四年获得中国医药研发(外包)20强证书,并获得北京科委颁发的“优秀CRO公司”证书。凭借自身实力和良好的信誉,北京卓越未来公司已成为制药企业合作的最佳选择。携手卓越未来,定能同创卓越、成就未来!"}
29 | {"text": "SMM11月20日讯:锂电行业,在经历2020年上半年的行业降温,产业链上的客户群,如前驱体、材料、电池、汽车等下游企业与上游镍钴锂原料生产企业之间已横亘着一层厚厚的迷雾目前疫情后市场,补贴退坡、全球贸易等诸多因素影响,后期行业又该如何在2020年末实现更好地开拓合作及谋求发展?SMM整合了锂电产业链的上下游企业,开启“SMM乘风破浪锂电万里行”考察团第三站湖南,与行业大佬一起进行实地考察中国锂电产业原料企业生产情况,谋求更精准、更深度的合作,创造更有效、更持续的交流。\n11月17日-20日SMM新能源事业部总监王甜、营销顾问余磊带领SMM工作人员以及考察团成员主要走访位于湖南的锂电产业原料企业生产情况, 谋求更精准更深度的合作机会。本次考察团由上海弗雷西阀门有限公司、江西省隆恩特环保设备有限公司、沃尔森廊坊控制系统设备有限公司、杭州上拓环境科技股份有限公司、凯鑫管道科技有限公司、湘潭惠博离心机有限公司大力赞助。第七站湖南雅城新材料有限公司。\n今日,SMM与考察团成员来到湖南雅城新材料有限公司,雅城新材料等领导表示热烈欢迎并进行了接待。首先,雅城新材料详细介绍了公司的业务发展情况。[URL],\n合纵科技于2015年创业板上市,是一家民营上市公司,属于能源领域。主营两大业务:电力板块配电智能化设备研发制造,是国内配电行业龙头企业;锂电池板块锂电池正极材料前驱体,是业内领先企业。\n锂电板块:通过湖南雅城+天津茂联公司构筑了“资源冶炼材料”完整产业链布局,掌握了上端资源拥有核心竞争力,未来2年左右将会成为国内外锂电池材料第一集团军,打造合纵科技第二支柱产业。\n随后,www.76989.cc,SMM与考察团成员参观了雅城新材料的工厂,深入了解钴系产品的技术优势以及特色之处。\nSMM及锂下游企业代表们就雅城新材料的核心竞争力、未来发展规划等方面进行了深入的交流。\n公司把电池材料的生产和研发作为产品的主要发展方向,从现有的锂电池正极材料四氧化三钴向磷酸铁、三元前驱体发展,致力于成为全国电池材料行业具有标杆地位的企业,成为全球重要的电池材料供应商,利用3-5年时间占领国内电池材料产业15%以上的市场,国际市场占有率达到5%以上。其中四氧化三钴主要用于制造锂离子电池正极材料,也可用于色釉料及磁性材料;氢氧化亚钴主要用于制造橡胶粘结剂、石化催化剂和锂电池正极材料;磷酸铁主要用于制造锂离子电池正极材料,也可用作催化剂及制造瓷等。\nSMM专门设立考察单位授牌环节,给考察企业与被考察企业之间更增添一份和谐发展、愉悦交流的仪式感,SMM新能源事业部总监王甜现场为雅城新材料授牌。\n参观工厂结束后,SMM及锂下游企业代表们与雅城新材料一起合影留念,增加彼此间更深厚的合作友谊,相信在接下来还将有更深层次的交流跟合作!\n经过此次走访调研,SMM与锂下游企业代表们对雅城新材料的产品、技术、公司发展情况等方面有了更深的理解,同时对锂行业的市场现状、发展趋势、以及存在的问题有了更深刻的认识,将继续与各大企业深化合作,以实现优势互补,共同推动中国锂产业的发展。\n"}
30 | {"text": "抚顺传媒网讯 (叶芷豪 抚顺晚报记者 刘 猛)用微信骂人被罚款2000元甚至拘留?酒席上劝酒把人灌进医院是故意伤害?养狗吓到邻居要赔偿精神损失费……这些发生在身边的小事稍不注意就可能触犯法律。眼下,在东洲区东洲街道腈纶社区,居民只要打开手机关注“社区法律微信公众号”,每隔一到两周就会收到这样鲜活的法律案例,然后就是司法解释和“法律小课堂”,让居民学法更加接地气。\n现在,社区法律微信公众号已经陪伴了大家两年多,越来越受大家的欢迎。社区书记徐丹介绍:“我以前从事过法律服务的工作,深知法律学习的重要性。为了让居民提高法律意识,我创建了这个微信公众号。随着《民法典》的颁布,为了让法律常识普及更接地气,我和同事们广泛搜集鲜活案例,完善传播形式,现在社区居民更欢迎这个普法公众号了。”"}
31 | {"text": "统行业企业投身电子商务领域,都使得电子商务的市场进一步扩大。\n调查显示,目前超过80%的人有网上购物的经历,超过50%的人会经常在网上商城购物。\n企业资源,改造传统业务,加强企业管理,降低运作成本,增强市场竞争力,提高经济效益,从而促进企业的改革与发展。\n而电子商务确实也显现了其对企业效益提升方面的作用!\n一:电子商务网站可以实现:\n会员注册、页面导航、站内搜索功能、产品捆绑营销、安全支付、订单信息确认等普通网站不能实现的功能!\n在所有类型的网站中,电子商务网站不管是在功能、盈利能力等方面都占有绝对的优势!\n但是因为目前电子商务网站建设费用的高昂、建站周期长和功能单一,不能支持移动端商城网站的建设,所以目前真正做了电子商务网站的企业并不多。\n二:如何高效制作电子商务网站?\n建站宝盒V6.0是一款专业服务于中小型企业的网站技术建设工具。经过不断的发展和完善,目前只要是一个懂打字的人,仅仅需要30分钟即可完成一个电子商务网站的建设!\n三:做一个电子商务网站要多少钱?\n988元=域名+2G主机+企业邮局+PC网站+手机网站+微网站+app\n宝盒V6.0只要988元就可以了。\n"}
32 | {"text": "“不要紧张,放松,救护车马上就到。”1月5日小寒时节,郑州高铁东站站台上寒风凛冽,郑州客运段高铁二队值乘周口东—郑州东列车的薛孟浩一边安慰突发疾病的女孩,一边展开应急救援。\n8时57分,G6626次列车缓缓减速即将终到郑州东站,列车长薛孟浩在4车立岗,这时听到对讲机传来有旅客突发疾病,呼吸困难的消息。闻讯,他立即赶到现场,8时58分列车进入郑州东站站台,马上将女孩带到站台上。女孩父亲告诉薛孟浩,他们父女在鄢陵站上车,此行正是要带女孩来郑州医院检查身体,并且女孩之前就有哮喘病史。“我父亲也有过哮喘病史,所以听说女孩得了哮喘病,我马上对其进行了简单的保护措施,安抚她的情绪,同时安排120急救车到原地救助。”薛孟浩说。\n此时,郑州的气温是零下4℃,大家都在急切地等待120急救车,列车工作人员跪在地上,用双腿当枕头,用身躯为女孩抵挡寒风,还用按摩的方式让女孩放松情绪。看到女孩在寒风中瑟瑟发抖,薛孟浩马上脱下自己的大衣为女孩盖上,并端来热水让女孩取暖。经过大家的努力,女孩的情绪慢慢稳定,呼吸也平稳了许多。\n9时10分,120医护人员到达现场,并展开救治工作,薛孟浩与车站和医务工作人员办理站车交接,留取了女孩父亲的联系方式。“后来我们给女孩父亲打电话询问女孩病情,在得知女孩病情稳定后,我们才松了一口气。”薛孟浩说。\n“通过这次突发事件,我们深刻感受到平时车队应急演练的重要性,频繁的演练让我们在面临各种突发情况时临危不乱,最大限度地保护好旅客的生命和财产安全。”薛孟浩说。"}
33 | {"text": "《白箱 SHIROBAKO》剧场版 ─ 喵森太神辣,你成长到叔叔都认不得你啦!\n今天,猫皮为大家带来《白箱 SHIROBAKO》剧场版的观影心得:\n简略:前作如实描述职场景况,剧场版则是强调干劲的可贵。\n(含直接关联的前导剧情总整理,有雷,请斟酌阅读)\n上山高中的动画同好会有五位颇具才华的成员,分别是宫森葵、安原绘麻、坂木静香、藤堂美沙与今井绿,他们在学生时期就以职业领域为目标,并在学园祭发表了初次原创作品《神佛混淆七福阵》,以此作为梦想的起点,这五位好友许下了将来出社会之后,还要再一起制作动画的约定。\n毕业两年半之后,故事的主人公-宫森葵已从天真的学生蜕变为社畜,在武藏野动画公司担任小小的执行制作助理,参与制作电视动画《Exodus!》的各项联勤工作,虽然葵在技术面没有明显的一技之长,却常怀热情面对她的工作,使得许多与葵接触的专家、老师们都相对地被她的积极性给激励到,不但能稳定的交出成品,也对宫森葵的工作态度评价很高。\n职场上有像葵一般地助推器,当然也会有雷包,好比说,态度轻浮又经常拖延进度的另一位执行制作-太郎,就与葵形成了明显地对比,另外还有一位虽然很有才能,却因过去在职涯中经历过大失败(这又是另一段故事了)导致在紧要关头经常自爆的监督-木下诚一,又或者是...(总之,地雷族繁不及备载)。\n此外,葵的‘七福阵同盟’同窗好友发展也并不顺利,与葵在同公司工作的原画师安原绘麻,难以在品质与量产之间取得平衡,立志成为声优的坂木静香,一直都只能替龙套或背景配音,始终得不到被发掘的机会,3DCG动画师藤堂美沙虽然顺利进入大型动画公司,却一直都只有画轮胎的份,编剧今井绿则是缺少贵人引导,甚至迟迟无法正式进入职场,连生活都成问题。\n同窗们都陷入瓶颈,武藏野团队有时不时爆开的内部问题,再再显示著二次元世界的背后,那动画工业链运作是何等地困难,更有外界不停丢进来的无理要求,这些都不断地打击著葵与团队的士气。\n但这些危机反而激起了葵那份‘一定要把作品完成’的干劲,并且如实反映在她的行动力上,使得本就卧虎藏龙的武藏野团队,也相对地被葵的这股干劲影响,不知不觉,团队以她为核心运作起来,同窗们也因为葵的介绍(或关系),一个一个加入武藏野团队,在众志成城之下,最终还是把本来会难产的作品给做出来,同时也算达成了当年还要再五人一起制作动画的约定。\n(以上为半年番前导剧情总整理)\n在先后成功制作了《EXODUS!》、《第三飞行少女队》两项大作之后,外界对武藏野团队的评价也有所提高,本来很有希望能再争取到更多工作,然而四年之后...。\n武藏野公司却因一次违约工程而几乎破产,濒临解散,信誉一落千丈,一直都很温暖、很照顾底下员工的社长引咎下台,大多团队成员也因武藏野没有能力再承揽足够的工作,只能选择各寻出路,好一点的人还能转去其他公司,比较惨的就只能窝在房间自怨自艾。\n为了生计,就连宫森葵的同窗好友也一一离开了武藏野,只剩下葵与几位武藏野的中心老臣仍勉强留在岗位上,靠着接受上游公司代理承包,再分割分配下来的小制作工作勉强度日。\n但急雨又打落难人,上游公司本来承包制作的动画剧场版《空中强袭登陆舰-SIVA》开了个超~绝~大天窗,预计以两年工程制作的作品,到了距限期倒数十个月时,居然只随便画了四格分镜,而武藏野方面早就完成了自己分配到的进度,正等待着上头发包,如今却又要再次面临违约连锁的窘境。\n上游公司看起来也不怕整包摆烂,但为了避免违约产生的亏损,居然还打算忝不知耻地将这烫手山竽般地合约转包给武藏野。\n武藏野的制片人-葛城刚太郎接到委托之后,在大骂同时也陷入两难,若不接合约,已经完成的进度就要整个打水漂,若接下合约,以现今分崩离析的武藏野,在十个月内完成一部剧场版真可说是痴人说梦,但是,制作统筹-渡边隼却把这个合约的去留交给葵来决定。\n葵当然深知这个合约的难处,但如此的巨大的危机,也可能是扭转武藏野现今立场的转机,经过一番挣扎之后,葵决定一肩担起‘制片人’的责任,打算再次召集武藏野原班团队,组队挑战这个庞大的怪物工程...。\n《白箱》被誉为‘每个动画宅都非看不可’的作品,正是它对于描述动画职场的那份真实感,它以诙谐有趣的情节,击溃了猫皮对动画业的遐想与期待,却相对地让猫皮对每位动画工作者肃然起敬。\n(遥想京阿尼事件...猫皮还包了一个月的薪水过去,有很大的原因是曾经收看过这部动画,当然,猫皮明白这是两家不同的公司。)\n但问题来了,虽然《白箱》在分类标签上确实被定义为‘社会写实’,猫皮也愿意相信本作中登场的每个人物、公司、过场事件、作品都有其原型考究,但矛盾的是,当时正在收看《白箱》的猫皮,其实对于动画职场的世界连一知半解的程度也没有,却仍十分相信‘这部动画就是业界的真貌’。\n这份无与伦比的说服力,与真实感到底是从何而来呢?就让猫皮在这向各位看倌介绍吧。\n在本作登场的角色不下数十位,只怕可能破百,一般来说,这么大量的角色对观众吸收剧情来说绝对会是个负担,但是就算你无法记住每个角色的名字,但那些角色正在做的事情,仍会很明白地告诉你他是‘谁’。\n就如同看到第三集时的猫皮:\n那家伙负责画分镜、而且很肥,好我记住了→\n喔喔,原来负责划分镜的人就是监督,好我知道了→\n原来就算监督很孬,但是基本上大家还是得尊重他的意思→\n至于那个肥监督名字...他叫谁来着(翻wiki)喔,原叫来木下诚一。\n就像这样,在《白箱》中一个角色构成,是依靠着大量有效而细腻行为描述堆砌而成,连作着相近工作的人,也会有各自清晰且独特的印象。\n好比说光原画师就有十几位,但有的人拖稿成性,有的人怎么画都画不好,有的人进入心流状态就有无与伦比的专注力,有的人一眼就能定夺一张的画的问题在哪。\n(原来那些经典名桥段都是这么改来的,一想到鬼灭之刃那段成名的‘火之舞神乐’要改多少次我就...,总之,请、请收下猫皮的膝盖吧!)\n除了众原画师之外,还有监督检讨系统、声优与配音现场,再由女主角喵森所处的‘执行制作(制作进行)’这个立场来贯穿所有角色,让剧情不会迷失在一片混乱中,实在非常优秀。\n再者,各角色的行为模式与动机都很丰富,也都十分契合他们的工作,而且越接近剧情核心的人,不但特色、动机更加复杂,却没有为了刻意讲究特色而失真(或许要归功于角色的背后原型,也能相对地看出监督水岛努的识人之广),但在故事运作时,这么庞大的人物设定都是以最少、最有效地动作来完成表达,也因‘工作性质’、‘性格’、‘表达效率’相辅相成,‘真实感’也就随之而来。\n也就是说,‘有效率地展现每个角色’正是白箱成功的原因,除此之外,在剧情中制作过程状况不断,也使得这一条龙剧情乐趣不断,看着角色东奔西忙的应付状况,也不自觉让猫皮融入这紧凑的节奏,甚至还让猫皮产生一种‘我是不是也要赶快起来做点什么正事’的躁动感。\n不过以上优点都有个大前提,就是恐怕得有够长的篇幅才能充分展现剧情,因为《白箱》的资讯量实在是太多了,所以刚开始以半年番的形式出厂,当然会是最有利的选择。\n假设半年番主题是以解决各种狗屁倒灶的状况为主,从而体现动画业职场的各种景况,那剧场版的主题是要抢在十个月内跑完制作剧场版一条龙,并且见证女主角从‘喵森’蜕变为王牌制作人的成长。\n相较于《白箱》长达二十四集,但步调仍显紧凑,剧场版仅有两小时,而且剧情脉络基本上是与前作相近的,发挥空间势必吃紧,再者,白箱也正是因角色的丰富度,才衍伸出这诸多面向可看,但剧场版却难有充足的空间来经营这么多角色,这样的话,剧场版的表现究竟会变得如何呢?\n确实就剧情步调来说,紧凑已不足形容,整体节奏约在急促与仓促之间,而且为了体现压线的紧张感,就连在剧情设计上,也让所有角色的目标都指向跟时间竞赛,更加深了这种急促感。\n但就算这样,猫皮仍觉得观影体验十分畅快。\n一眨眼,发现队友只剩你们了...。\n故事初期的武藏野已处于分崩离析的状态,选择留下的葵权位加重,此时的她已不再仅仅只是团队的参与者,这点从众人征询葵意见时的态度就能看得出来,他们不是‘想加减听点不同意见’,而是以‘只要喵森点头,我们就干’的气势在询问她,与白箱前几集时,葵与其他成员的互动状况形成强烈对比。\n虽然葵看起来还是那有点笨笨的样子,但当她答应临危授命之时,其实讲出来的话都掷地有声,气场十足,被称为‘ACE’足以服众,而这就更能确定这部剧场版就是她的主场。\n加上在半年番时期,观众都已经习惯以‘喵森’为主要视角,因此,剧场版选择性地淡化其他角色的戏份,强化葵的立场,并让她透过指挥、联络,来串连起全部角色,使得节奏虽然有点赶火车,却反而强化了剧情的力道。\n此外,更有值得一提的是,那些重要转折的表现手法,剧场版多次以各种超演绎来添加大量剧情张力,在某些桥段的剧情温度趋于温冷时,又适时地把气氛拉回来,而且运镜十分精彩,光有了这几段,再加上结局的表现,相信就足以说服各位看倌《白箱SHIROBAKO》是绝对对得起往日威名的。\n总地来说,《白箱SHIROBAKO》绝对是一部够精采的作品,不枉费让众人等了这么久。\n不过,登场角色太多仍然是个问题,虽然大多情况是由葵来主导剧情,但仍难免会有葵不在场的情节,由于配角们平均分配到的戏份太少,导致在次要角色之间的互动,就会因为掌握不到着力点,而有点令人昏昏欲睡。\n如果是完全没看过前作的人,对此感觉还会再稍微严重一点,但为此再去把半年番补完,又是个巨大的时间成本。\n但尽管如此,《白箱SHIROBAKO》仍是一部主题明确、有强烈剧情张力、还有超棒人物设定的优秀作品,以这剧情来说,也很适合作为《白箱》系列的完美End,那么,猫皮就在这以高分推荐给各位看倌了。\n本周车库电影平台精选六部电影,快评推荐:\n《BNA--动物新世纪 1~6集》 深入解析——难道是成为兽控入门作!\n本周车库电影平台精选五部电影,快评推荐:"}
34 | {"text": "近日,全省“枫桥式公安派出所”命名大会在成都召开,开江公安局回龙派出所被命名为首批省级“枫桥式公安派出所”。2020年12月25日上午,赴省参加命名大会的回龙派出所所长载誉而归,县局举行省级“枫桥式公安派出所”代表欢迎仪式,局党委书记、局长周忠平,局党委副书记、政委朱治国出席仪式,在家局党委委员,局属各部门负责人参加欢迎仪式。\n周忠平局长致欢迎词向回龙派出所表示祝贺,恭喜他们在首批省级“枫桥式公安派出所”创建活动中成为全县排头兵,充分发挥“枫桥式公安派出所”典型示范引领作用,为开江公安争光,希望他们以此次命名为激励,进一步做实各项工作,争取更好的成绩。同时,他要求全局上下要充分认识传承和发展新时代“枫桥经验”的重要意义,牢牢把握“对党忠诚、服务人民、执法公正、纪律严明”的总要求,忠实践行人民公安为人民的宗旨,紧密结合“坚持政治建警全面从严治警”教育整顿,积极探索开江公安新思路、新路径,为开江经济社会又好又快发展营造良好的治安环境。(开江公安局:刘清洪)"}
35 | {"text": "公司与高校合作,湖南科技学院廖云辉博士共同组建了“鹭翔博士后研发中心”,通过高校的人才引进不断提升公司研发能力,通过校企合作、对外引进和共同研发的多种合作方式,公司在空气治理、水污染治理和土壤治理方面取得了行业领先技术。\n鹭翔博士后研发中心下设空气治理研发部、水污染治理研发部和土壤修复研发部,经过几年的研发,力争把公司建设成为一家国内领行的综合性环保产业公司。\n公司研发带头人介绍:\n廖云辉,男,1991年10月生,江西萍乡人,化学专业博士,任教湖南科技学院,东莞鹭翔环保新材料科技有限公司研发带头人,曾参与2项国家自然科学基金项目、省项目3项、中国科学院项目3项。发表SCI论文3篇,会议论文2篇,申请专利3项。\n"}
36 | {"text": "密度是测量特定体积内质量的量,密度等于除以体积,用符号ρ表示,在国际单位制和中国法定计量单位中,密度为千克/米3。\ntpe材料应用广泛,主要用于普通透明玩具、运动器材等。它是一种弹性高、强度高、回弹性高、注射成型的材料。它可以用普通的热塑性塑料成型机加工,不需要特殊的加工设备。然而,许多人不知道它的密度。tpe材料的密度是多少?\ntpe材料的密度是多少?\n1、tpe材料的密度有大有小,也可以分为有填料和一些无填料。tpe材料是由SEBS基材和其他混合物混合而成的弹性颗粒。因此,tpe密度越高,填料越多。\n2、tpe材料有用的是进口原料制作,也有国产原料制作,进口和国产两者的密度不同,正常密度在0.92~0.98之间。\n3、TPE材料的密度可以调整到0.84~2.0,一般注射用的TPE、TPR软材料的比重在0.9~1.25左右,特殊的TPE、TPR的比重小或超高。提高比例可以降低产品成本,但材料的拉伸强度和弹性、耐磨性会降低。\n"}
37 | {"text": "根据靖西市委、市人民政府要求,靖西供电公司帮扶点处于靖西最边远的乡镇,其中那多村8户、大面村14户贫困户要在2016年底前完成脱贫攻坚任务。经过半年多的艰苦努力,靖西供电公司帮扶点2016年预脱贫贫困户达到了脱贫目标。\n为使真正困难群众家庭得到实实在在的援助,靖西供电公司领导高度重视,多次深入挂钩村贫困家庭,与贫困户交心谈心,增强他们脱贫致富的决心。靖西供电公司委派的驻村第一书记及由公司中二层以上管理人员组成的帮扶人员还走到田间地头开展调查研究,对致贫原因、存在问题认真分析,研究解决方案,制定脱贫工作计划和措施。同时,积极与村委干部沟通联系,把握全市扶贫政策和脱贫思路,并明确帮扶援助的内容、形式和时间,务求取得实效。\n据悉,为做好本次脱贫迎检验收工作,靖西供电公司14名2016年预脱贫帮扶人员,多次不畏艰难分赴魁圩乡那多村、大面村各屯,了解帮扶户脱贫开展情况,并认真填写各种档案及验收表格资料。目前,靖西供电公司2016年预脱贫贫困户22户所有验收资料都已填写核实完毕,准备迎接市扶贫检查组的检查验收。\n下一步,靖西供电公司将继续按照市委、市人民政府的工作部署和要求,不断深化帮扶力度,以促进农民持续稳定增收为重点,继续做好结对促建、“1+1”结对帮扶等工作。\n"}
38 | {"text": "液化石油气循环压缩机的工作介质为民用液化石油气或与之相类似的气体,如丙烷、乙烷、氨气。它主要用于液化石油气或性质与之相类似气体的增压,也可用于抽真空。因此,该种类的压缩机是城镇、厂矿、码头液化石油气储运站、液化石油气罐瓶厂、液化石油气汽车加气站的关键设备,也是化工企业增压回收气体的理想设备。它可实现如下作业:\n1、液化石油气槽车、槽船的装卸;\n2、液化石油气或性质与之相类似气体的装瓶、倒罐;\n3、液化石油气余气和残液的回收;\n4、化工产品生产过程中尾气的回收;\n5、抽真空等。\nZW系列、CZW系列液化石油气循环压缩机为立式,单作用、风冷、无油润滑、往复活塞式。我厂各类液化石油气系列压缩机气缸、填料部件均为无油润滑,保障了其工作介质的纯度。曲轴、连杆、十字头部件为压力润滑(飞溅润滑),以保障润滑的可靠性。\n本厂液化石油气系列压缩机具有体积小、重量轻、运转平稳、噪音低、结构简单、操作方便、安全可靠等特点。其中,ZW系列、CZW系列压缩机是目前国内先进的机组,各项技术指标达到国际先进水平。它集压缩机、电机、气管路系统、高效气液分离器、四通阀为一体,使安装、操作更方便。"}
39 | {"text": "南京力天装饰2020年会盛典在南京大玩轰趴圆满落下帷幕。力天公司高管、重要合伙人、以及公司各业务领域业务骨干和优秀员工共聚一堂,共同见证力天经典创造的荣耀,共同学习探讨2020年即将面临的新挑战和新机遇,共同规划制定公司2020年行动蓝图。\n2020年1月16日,下上17:30分,在声乐伴随,灯光璀璨、热烈欢快的氛围下,2020年力天装饰年会盛典正式拉开帷幕。\n通过半个小时激情昂扬的演讲,力天总经理钟廷耀总结了我们共同奋斗过的2019,展望了更具挑战的2020,有方法,有对策,有承诺,有期许。我们坚信,2020在力天老总的带领下,将共同见证力天经典更辉煌的时刻。\n回首,是为了更好的前行!高瞻远瞩,继往开来。2019已渐行渐远,2020我们奋力拼搏!\n启程2020,凝心聚力,追梦前行!\n伴随着荣耀与感动, 2020年会盛典圆满成功。带着收获与感恩,载着希望与信心,2020我们将同心同行,始终如一,不畏风雨,勇往直前,力天装饰将迈向更高的台阶!\n"}
40 | {"text": "传感器发展的整体发展趋势将更加与民生工程看齐【竞博电竞平台】\n本文摘要:竞博电竞平台电子竞技竞猜平台竞博电竞电子竞技赛事平台在现如今加工制造业智能化系统转型发展的的浪潮下,做为其关键技术,工业生产传感器销售市场也越来越更加火爆,此外,市场需求也更为猛烈。资本主义国家在传感器领域具备技术性和知名品牌等优点,因而现阶段中高档商品销售市场或是被外资公司所核心,尤其是在精密度规定较高的工业生产传感器领域。\n在现如今加工制造业智能化系统转型发展的的浪潮下,做为其关键技术,工业生产传感器销售市场也越来越更加火爆,此外,市场需求也更为猛烈。传感器最开始的发展,便是来源于工控自动化的促进。\n出自于提高工作效率的目地,工业化生产逐渐由中间主控室操纵每个生产制造连接点上的参数,包含总流量、物位、温度和工作压力四大主要参数,催产了传感器的发展。这一发展趋势从上世纪七十年代逐渐,到现在也是传感器运用数最多的一种方式。但伴随着愈来愈多的公司投身于传感器精兵,其销售市场也慢慢展现饱和状态的情况。现阶段世界各国有关传感器生产商做到上万家和。\n据数据分析,从全世界整体状况看,英国、日本等极少数经济发展资本主义国家占有了传感器销售市场70%之上市场份额。现阶段在我国的传感器产业链已产生从技术研发、设计方案、生产制造到运用的详细产业链管理体系,但因为在我国传感器技术性相比于海外优秀我国,在产品研发上或是比较落伍,高新科技产品较少。资本主义国家在传感器领域具备技术性和知名品牌等优点,因而现阶段中高档商品销售市场或是被外资公司所核心,尤其是在精密度规定较高的工业生产传感器领域。\n全世界著名的传感器生产商,比如霍尼韦尔、ABB、omron、横河电机、西门子PLC等公司,其商品运用也多集中化于工业生产机械自动化、工业机械手等领域。在这类状况下,中国一部分传感器公司将眼光看向了民用型传感器领域。相比于工业生产传感器,民用型传感器生产制造规定没有那么严苛,而且运用领域普遍。\n伴随着新型智慧城市定义的明确提出,民用型传感器领域也将迈入销售市场“瀚海”。福建省上润企业就在民用型传感器领域开拓了一片新的销售市场,2016年,上润运用传感器技术性自主研发了智慧水务系统软件,并方案从2016年到2025年资金投入三亿元至五亿元,在福州市供水管道网里安装八万好几个无线网络传感器等智能产品,用以城市供水漏损整治新项目的执行。不但是智慧水务,在新型智慧城市的基本建设中,有好几个领域都必须以传感器技术性为基本。现阶段,很多大城市中的桥梁建筑早已历史悠久,逐渐发生不一样水平的产品质量问题。\n江苏无锡在蓉湖立交桥、开源系统立交桥二座公路桥梁的桥体各部安装了百余个传感器,根据好几个瞬时速度传感器精确测量这座斜钢缆的瞬时速度,来得到 其自振频率,进而推论钢缆的身体状况。除此之外,在大城市的地铁站基本建设中传感器也被广泛运用。在地铁站的自然环境自动控制系统里,必须应用房间内温度湿度传感器、管路温度湿度传感器及其Co2浓度值传感器,以检测地铁站即时的温度、环境湿度、空气指数。\n也有环保监测、智能穿戴设备等领域也必须很多应用各式各样的传感器技术性。在智能化系统的时期大情况下,传感器发展的整体发展趋势将更加与民生工程看齐,另外,现代化运用的发展也为民用化出示了推动功效。将来传感器将向多元化方位发展,投身于在其中的公司也许能够再次思索,找寻新的发展之途。\n“传感器发展的整体发展趋势将更加与民生工程看齐”由机电网梳理公布,如需转截,请标明文章内容来源于,大量行业动态,请加关注:机械加工行业。\n"}
41 | {"text": "【热点聚焦】中展智奥&新浪家居一行,造访雅绣之家总部,思想碰撞,共探未来!\n2021年5月22日,由中展智奥、新浪家居及行业大咖、专家组成的考察团,在雅绣董事长汪煜伟汪总的带领下,走进了位于杭州萧山的雅绣总部。\n雅绣公司成立于1996年,2012年创立雅绣品牌,是最早进入墙布行业的企业之一。\n因传承而深远,因变革而锐意,因坚持而历久弥新,作为软装行业的传承者与引领者,雅绣以引导软装行业形成健康家文化风向标为愿景,以顾客为中心,提供符合顾客需求的产品与服务为己任,专注健康家居事业。\n在雅绣营销总监赵总的带领下,考察团一行深入雅绣工厂一线,实地探访了雅绣刺绣车间,生产车间。各区域之间井然有序,分工明确,相互独立又环环相扣,员工团结协作,既保证工作效率又提升产品品质。干净整洁的车间布局,先进高端的织造设备给在场的每一位留下了深刻印象!\n雅绣之家整体软装,产品做工精细,风格设计时尚新颖,32道生产工序,对细节要求苛刻,精益求精。全案设计满足客户的不同风格设计需求,在业内树立了良好的口碑。雅绣线上商城和线下数百家专卖店为全国千万用户提供更好的购买体验和更便捷的专属定制服务。\n在一系列的参观结束后,探访团与汪总进行了友好交流。在今年行业业绩普遍下滑的背景下,雅绣2021年第一季度即实现了同比增长20%的预期目标,这对于雅绣而言无疑是一种强有力的肯定。汪总表示,预计在今年8月份,雅绣将重新上线窗帘将窗帘产品与雅绣品牌调性重新整合,此举在丰富自身产品线的同时,也提升了门店的纯净度,提升经销商粘性。在软装融合的趋势面前,墙布企业增添窗帘品类看似是大势所趋。汪总在会议上提出,拓品类不是简单地增加生产线、招聘工人就能成功的,而是要以设计为核心,将窗帘产品完美融入到自身的品牌调性上,才能将这一品类推广到自己的经销商,才能使经销商获利。\n变化是未来的常态,它加速了行业洗牌,2021年的市场环境也势必变幻无穷,充斥着各种挑战和机遇。雅绣将持续深化产品结构,不只是单一的产品设计,而是打造一站式系统方案,从卖设计、卖服务,向软装一体化过渡,为经销门店构建强大的服务系统,为用户打造舒适的生活环境。此外,雅绣将一如既往加大品牌建设与渠道建设,深化品牌知名度,拓宽墙布这一新兴建材的受众面。\n【雅绣墙布】童心相伴,与爱同行,最贴心的礼物来自最爱你的人!\n【雅绣墙布】新品设计案例,一进屋就被迷住了,年轻有个性,喜欢就照着装!"}
42 | {"text": "1、电源要求为三相交流,频率50HZ,电压380V时,电动机和电器上允许电压拨动的上限为额定电压的+10%;下限(尖峰电流时)为额定电压的-15%。\n2、工作环境中不得有易燃、易爆和腐蚀性气体。\n3、安装使用地点的海拔不超过2000米,超过1000米时要对电动机容量进行校核。\n4、吊运物品对起重机的辐射温度不超过400摄氏度。\n5、室外使用的起重机非工作状态的风压为800Pa。\n1、起重机的起重能力应达到额定起重量。\n2、对吊钩起重机,起吊物在下降制动时的制动距离(控制器在下降速度低挡稳定运行,拉回零位后,从制动器断电到货物停止时的下滑距离)应小于1分钟内稳定起升距离的1/65。\n3、对吊钩起重机,当上升的工作级别为M4、M5、M6时,且额定上升速度等于或高于5m/min时要求制动平稳,应采用电气制动的办法,保障在0.2~1.0额定负荷范围内下降时,制动前的电动机转速降到同步速度的1/3以下,该速度应能稳定运行。\n4、电磁吸盘的吸重能力应不小于额定值。\n5、双小车起重机,两小车相同机构的操作应是机可以联动,也可以单独动作。\n1、一般采用交流传动交流控制系统,在使用频繁或工作条件恶劣的情况下,宜采用直流传动、控制系统。\n2、宜采用标准的起重机电气控制设备。\n3、起重机成套电阻器宜采用标准产品,如特殊需要,也可由制造厂自行设计,但必须符合GB3811-2008中相关要求。\n4、其他电气设备和元器件应选用起重机专用或能满足起重机要求的产品。\n5、电器配套产品要有生产许可证或型号使用证或能满足起重机要求的产品。\n1、电压损失,交流电源供电,在尖峰电流时,自供电变压器的底母线到起重机任何一台电动机端子的电压损失要小于额定电压的15%。\n2、起重机内部电压损失计算。\n具体相干计算参考博客《起重机电器的计算》。\n1、电器设备安装应牢固,在工作过程中,不应发生相对于主机的水平移动和垂直跳动,垂直安装的控制柜、屏,其垂直度小于千分之12,安装部位高震动条件为:5~13HZ时,位移是1.5mm;13~50HZ时,震动加速度为10m/S2。\n2、安装在电器室内的电器设备,其防护等级可以为IP00,但应当有适当的防护措施。\n3、4箱及以下的电阻器可以直接叠装,5箱及箱叠装时,应考虑加固措施并要求各箱之间的距离大于80mm,间距过小时应降低容量使用或采取其他措施。\n4、安装在其中各部位的电气设备,应能方便和安全维修。走台上和电气室内的电气设备前一般应留有600mm以上的通道,特殊情况下允许适当缩小,但不应小于500mm。\n5、室内使用的起重机,安装在桥架上的电器设备应无裸露的带电部分,低防护等级为IP10。室外使用的起重机,其电器设备如安装在无遮蔽防护的场所时,其外壳防护等级不应低于IP33,在有遮蔽防护的场所,其外壳防护等级可以适当降低。\n6、起重机大、小车馈电装置的裸露带电部分和金属结构之间的距离应大于30mm,起重机运行时可能产生相对晃动时,其间距应大于晃动量加30mm。\n长期高温下工作的起重机,其司机室应采取隔热措施。电控设备需要采取降温措施,司机室内应安装风扇和电源插座等。"}
43 | {"text": "加盟你一言我一鱼酸菜鱼怎么样?在众多的酸菜鱼品牌中,它一直都是极具特色的高人气品牌,已经成为众多创业者所青睐的致富之选,该品牌具备良好的经营理念,致力于为消费者们提供一个广阔的创业致富平台,依托你一言我一鱼酸菜鱼,你一定可以快速致富!\n你一言我一鱼酸菜鱼,知己酸菜鱼,由“鱼”你而更美妙!你一言我一鱼酸菜鱼结合主流消费群体-年轻人的消费需求,主打知己酸菜鱼,用正餐快餐化的经营理念,为人们创造口感纯正、用餐便捷、氛围独特的舒适用餐空间,一经推出,瞬间风靡全国,成为加盟商的热门选择。\n你一言我一鱼酸菜鱼之所以好吃,其原因而二,这之一便是其作为主料的鱼是选自太平洋4700米深海区野生龙利鱼,总部自营大型食品工厂,深海龙利鱼,从登陆、进厂、现杀、急冻、到店,全程可追溯,卫生有保障。原因之二则是运用四川古法酸菜泡制方法制成,酸香味醇,清淡爽口,采用自然抑菌,富含氨基酸,色泽鲜亮,酸中带脆,香味扑鼻,开胃提神,醒酒去腻,老少适宜。\n一人食,有鱼作伴,多人食,有鱼为“媒”。你一言我一鱼酸菜鱼严格把控食材品质及制作工艺,制成的酸菜鱼肉质细嫩,汤酸鲜美,口感令人回味。时尚的品牌形象、舒适的格调氛围,符合现代消费群体审美需求,你一言我一鱼致力于打造出立体式的用餐休闲空间。\n你一言我一鱼与国内各大外卖订餐平台开展深度合作,让你不只做一条街的生意,更做整个城的生意,线上线下联动,收获四面八方向你靠拢!你一言我一鱼酸菜鱼加盟,全套时尚店设计图纸,全店VI系统,无偿赠送给加盟商,更有专人上门根据店面布局,协助方案落地。开店不限地址,销售线上线下覆盖,手中不分男女老少,如此有前景,如此有口碑,创业还会难吗?\n上海上诠餐饮管理有限公司是一支由各行业精英组成的餐饮创业超能战队,200余人组成的团队中,研究生学历30人,本科学历95人,大专学历67人,高水平的成员素质决定了公司从战略规划至企业运作的高效率,及整体发展的高度前瞻性。\n团队中拥有在餐饮行业从业20余年的名厨团队,负责餐饮品牌的研发与创新,并对加盟商倾囊相授加盟经验。餐饮品牌运营推广管理团队,拥有国内餐饮知名餐饮公司管理经验,对品牌运作全程进行完善把控。\n公司根据餐饮行业创业特点,运用全员之力,旨在做到“专业人才全面、创业扶持全面、诠释餐饮创业最佳方法”,平均年龄在43岁的中高层管理者掌舵全局,平均年龄在32岁的中层管理者设定发展战术,平均年龄在25岁的基层员工用热血在公司发光发热,全员上下协调,全力以赴,打破行业不专业、不全面的现状,用“诠力”,“诠释”餐饮创业者的成功之梦!\n你一言我一鱼酸菜鱼市场分析:\n随着80后90后成为餐饮消费市场的主流人群,浓郁鲜美的酸菜鱼火速上榜成为国民菜。据官方数据显示,截止2017年上半旬,在我国已开设的“酸菜鱼”店面中,上海市约1222家,北京市约506家,广州市约1416家,深圳市约707家。“酸菜鱼”已成为各大城市的必备餐饮店。\n你一言我一鱼总部特聘北京、重庆五星级宾馆川菜主厨,在传统酸菜鱼基础上,融入名贵中药材,打造不上火的酸菜鱼,销售不分季节!你一言我一鱼酸菜鱼核心原料均由总部统一配送,同行难以模仿,你一言我一鱼的特色口味,紧抓吃货的味蕾,销量自然上升!出餐快是你一言我一鱼的另一个特点,精简操作,料包量化,客人再多也无需等待,就餐体验非常好,来一次立马成为回头客!\n"}
44 | {"text": "工业厂房在使用过程中,若发现厂房钢结构接缝开裂,出现锈蚀,螺栓连接节点松动等问题时,要引起足够重视,并且需要找有厂房检测的企业进行厂房钢结构检测,及时发现安全隐患,针对问题进行相应的加固修补,以免对日后的正常生产造成不良影响。\n钢结构检测的优势:\n钢结构检测主要分析了适应于计算机视觉处理的钢结构焊缝缺陷无损检测技术,为后续采用模式识别技术来进行焊缝缺陷定性、定位和定量分析奠定基础。随着当代建筑技术日新月异的发展,钢结构在当代建筑中使用率越来越高,超声波检测是常规的无损检测方法之一。加之钢结构多层建筑的不断增多,无损检测工作量也越来越大,除了在焊接工艺上加大控制以外,在无损检测上也应加大检测力度,并应尽早在钢结构多层建筑焊缝无损检测标准上体现出来。\n钢结构检测的目的是什么,大家知道为什么要对钢结构检测吗:很多钢结构建筑物虽然依旧在使用,看外观也丝毫找不出任何问题,其实,实际上存在的问题也不是一个两个了,对于处于这种状态的钢结构,得及时检测,明确问题后也好对症施工。\n公司自成立以来,共完成施工周边房屋、一般性房屋安全、危房鉴定、公共场所开业或年审、租赁房屋安全、工业厂房可靠性、民用建筑可靠性、房屋灾后及法院委托司法等各类项目数百宗。\n公司利用自身雄厚的技术力量和经济基础,发挥传统经验和新科技相结合的方法,采用的检测设备,不断探索和总结鉴定的技术和方法。公司成立十多年来进行大量各种类型的房屋鉴定,积累了丰富的房屋鉴定和检测经验,有特种行业和工商开业、年检的房屋安全鉴定、施工周边房屋安全鉴定、还有房屋结构可靠性和抗震性鉴定等等,特别是对房屋损害、质量纠纷的鉴定方面,站在立场,鉴定结论令双方当事人心服口服,纠纷得到圆满解决。"}
45 | {"text": "丹阳金运合金有限公司位于丹阳东郊——镍合金生产基地吕城镇运河,距离常州民航机场、高速公路罗溪出口4KM,距大港港口28KM沪宁铁路、京杭大运河、312国道横穿本镇。水、路、空交通十分便利。公司通过了ISO9000质量管理体系认证,产品全部按国家标准生产,是一家集冶炼、开发、生产高温合金、高镍合金、镍合金、耐蚀合金、因科合金、蒙乃尔合金、精密合金及各种特种合金材料于一体的高新技术生产型企业。公司拥有50公斤 100公斤 200公斤 500公斤 1.5吨真空和非真空感应炼钢炉,电渣炉和锻造。产品有管材、棒材、板材、丝材、带材、法兰、锻件和管件等。产品应用于石油化工、航空航天、船舶、能源、军工、电子、环保、机械以及仪器仪表等领域。"}
--------------------------------------------------------------------------------
/pics/demo.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/demo.jpeg
--------------------------------------------------------------------------------
/pics/firefly_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/firefly_logo.png
--------------------------------------------------------------------------------
/pics/gongzhonghao.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/gongzhonghao.jpeg
--------------------------------------------------------------------------------
/pics/gongzhonghao.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/gongzhonghao.png
--------------------------------------------------------------------------------
/pics/len_distribution.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/len_distribution.png
--------------------------------------------------------------------------------
/pics/task_distribution.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/task_distribution.png
--------------------------------------------------------------------------------
/pics/train-loss-2b6-v2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/train-loss-2b6-v2.png
--------------------------------------------------------------------------------
/pics/train-loss-qlora.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/train-loss-qlora.png
--------------------------------------------------------------------------------
/pics/train-loss-ziya-13b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/train-loss-ziya-13b.png
--------------------------------------------------------------------------------
/pics/wechat-group.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yangjianxin1/Firefly/e22b406ee440fda0b18a073c6325853de17741cb/pics/wechat-group.jpeg
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | accelerate==0.21.0
2 | transformers==4.34
3 | peft==0.4.0
4 | bitsandbytes==0.39.0
5 | loguru==0.7.0
6 | numpy==1.21.4
7 | pandas==1.2.5
8 | tqdm==4.62.3
9 | deepspeed==0.9.5
10 | tensorboard
11 | sentencepiece
12 | transformers_stream_generator
13 | tiktoken
14 | einops
15 | httpx
16 | scipy
17 | torch==1.13.1
18 | mmengine
19 | xformers
20 | astunparse==1.6.2
21 | flash_attn
22 | datasets
23 | trl==0.7.11
24 | typing_extensions==4.9.0
25 | mpi4py
--------------------------------------------------------------------------------
/script/chat/chat.py:
--------------------------------------------------------------------------------
1 | from transformers import AutoTokenizer, AutoConfig, AddedToken
2 | import torch
3 | from loguru import logger
4 | import copy
5 |
6 | import sys
7 | sys.path.append("../../")
8 | from component.utils import ModelUtils
9 | from component.template import template_dict
10 |
11 |
12 | def build_prompt_chatglm3(tokenizer, query, history, system=None):
13 | history.append({"role": 'user', 'message': query})
14 | # system
15 | input_ids = tokenizer.get_prefix_tokens() + \
16 | [tokenizer.get_command(f"<|system|>")] + \
17 | tokenizer.encode(system, add_special_tokens=False)
18 | # convs
19 | for item in history:
20 | role, message = item['role'], item['message']
21 | if role == 'user':
22 | tokens = [tokenizer.get_command(f"<|user|>")] + \
23 | tokenizer.encode(message, add_special_tokens=False) + \
24 | [tokenizer.get_command(f"<|assistant|>")]
25 | else:
26 | tokens = tokenizer.encode(message, add_special_tokens=False) + [tokenizer.eos_token_id]
27 | input_ids += tokens
28 |
29 | return input_ids
30 |
31 |
32 | def build_prompt(tokenizer, template, query, history, system=None):
33 | template_name = template.template_name
34 | system_format = template.system_format
35 | user_format = template.user_format
36 | assistant_format = template.assistant_format
37 | system = system if system is not None else template.system
38 |
39 | if template_name == 'chatglm2':
40 | prompt = tokenizer.build_prompt(query, history)
41 | input_ids = tokenizer.encode(prompt)
42 | elif template_name == 'chatglm3':
43 | input_ids = build_prompt_chatglm3(tokenizer, query, history, system)
44 | else:
45 | history.append({"role": 'user', 'message': query})
46 | input_ids = []
47 |
48 | # setting system information
49 | if system_format is not None:
50 | # system信息不为空
51 | if system is not None:
52 | system_text = system_format.format(content=system)
53 | input_ids = tokenizer.encode(system_text, add_special_tokens=False)
54 | # concat conversation
55 | for item in history:
56 | role, message = item['role'], item['message']
57 | if role == 'user':
58 | message = user_format.format(content=message, stop_token=tokenizer.eos_token)
59 | else:
60 | message = assistant_format.format(content=message, stop_token=tokenizer.eos_token)
61 | tokens = tokenizer.encode(message, add_special_tokens=False)
62 | input_ids += tokens
63 | input_ids = torch.tensor([input_ids], dtype=torch.long)
64 |
65 | return input_ids
66 |
67 |
68 | def load_tokenizer(model_name_or_path):
69 | # config = AutoConfig.from_pretrained(model_name_or_path, trust_remote_code=True)
70 | # 加载tokenzier
71 | tokenizer = AutoTokenizer.from_pretrained(
72 | model_name_or_path,
73 | trust_remote_code=True,
74 | use_fast=False
75 | # llama不支持fast
76 | # use_fast=False if config.model_type == 'llama' else True
77 | )
78 |
79 | if tokenizer.__class__.__name__ == 'QWenTokenizer':
80 | tokenizer.pad_token_id = tokenizer.eod_id
81 | tokenizer.bos_token_id = tokenizer.eod_id
82 | tokenizer.eos_token_id = tokenizer.eod_id
83 | if tokenizer.pad_token is None:
84 | tokenizer.pad_token = tokenizer.eos_token
85 | # assert tokenizer.pad_token_id is not None, "pad_token_id should not be None"
86 | return tokenizer
87 |
88 |
89 | def main():
90 | # 使用合并后的模型进行推理
91 | # model_name_or_path = 'Qwen/Qwen-7B-Chat'
92 | # template_name = 'qwen'
93 | # adapter_name_or_path = None
94 |
95 | model_name_or_path = '01-ai/Yi-6B-Chat'
96 | template_name = 'yi'
97 | adapter_name_or_path = None
98 |
99 | template = template_dict[template_name]
100 | # 是否使用4bit进行推理,能够节省很多显存,但效果可能会有一定的下降
101 | load_in_4bit = False
102 | # 生成超参配置
103 | max_new_tokens = 500
104 | top_p = 0.9
105 | temperature = 0.35
106 | repetition_penalty = 1.0
107 |
108 | # 加载模型
109 | logger.info(f'Loading model from: {model_name_or_path}')
110 | logger.info(f'adapter_name_or_path: {adapter_name_or_path}')
111 | model = ModelUtils.load_model(
112 | model_name_or_path,
113 | load_in_4bit=load_in_4bit,
114 | adapter_name_or_path=adapter_name_or_path
115 | ).eval()
116 | tokenizer = load_tokenizer(model_name_or_path if adapter_name_or_path is None else adapter_name_or_path)
117 | if template_name == 'chatglm2':
118 | stop_token_id = tokenizer.eos_token_id
119 | elif template_name == 'chatglm3':
120 | stop_token_id = [tokenizer.eos_token_id, tokenizer.get_command("<|user|>"), tokenizer.get_command("<|observation|>")]
121 | else:
122 | if template.stop_word is None:
123 | template.stop_word = tokenizer.eos_token
124 | stop_token_id = tokenizer.convert_tokens_to_ids(template.stop_word)
125 |
126 | history = []
127 |
128 | query = input('User:')
129 | while True:
130 | query = query.strip()
131 | input_ids = build_prompt(tokenizer, template, query, copy.deepcopy(history), system=None).to(model.device)
132 | outputs = model.generate(
133 | input_ids=input_ids, max_new_tokens=max_new_tokens, do_sample=True,
134 | top_p=top_p, temperature=temperature, repetition_penalty=repetition_penalty,
135 | eos_token_id=stop_token_id
136 | )
137 | outputs = outputs.tolist()[0][len(input_ids[0]):]
138 | response = tokenizer.decode(outputs)
139 | response = response.strip().replace(template.stop_word, "").strip()
140 | # update history
141 | history.append({"role": 'user', 'message': query})
142 | history.append({"role": 'assistant', 'message': response})
143 |
144 | print("Firefly:{}".format(response))
145 | query = input('User:')
146 |
147 |
148 | if __name__ == '__main__':
149 | main()
150 |
151 |
--------------------------------------------------------------------------------
/script/evaluate/evaluate.py:
--------------------------------------------------------------------------------
1 | from mmengine.config import read_base
2 | from opencompass.models import HuggingFaceCausalLM
3 |
4 | batch_size = 20
5 | # 指定评测模型
6 | model_name_or_paths = [
7 | 'internlm/internlm-chat-7b',
8 | 'baichuan-inc/Baichuan-13B-Chat',
9 | 'THUDM/chatglm2-6b',
10 | 'YeungNLP/firefly-baichuan-7b',
11 | 'YeungNLP/firefly-baichuan-13b',
12 | 'YeungNLP/firefly-internlm-7b',
13 | 'YeungNLP/firefly-chatglm2-6b',
14 | 'YeungNLP/firefly-ziya-13b',
15 | 'YeungNLP/firefly-bloom-1b4',
16 | 'YeungNLP/firefly-bloom-2b6-v2',
17 | 'YeungNLP/firefly-qwen-7b',
18 | 'OpenBuddy/openbuddy-llama2-13b-v8.1-fp16',
19 | 'OpenBuddy/openbuddy-llama2-13b-v11.1-bf16',
20 | ]
21 |
22 | models = []
23 | for model_name_or_path in model_name_or_paths:
24 | # baichuan-7b与qwen的pad_token_id为None,将无法正常评测
25 | if 'baichuan-7b' in model_name_or_path.lower():
26 | pad_token = ''
27 | elif 'qwen' in model_name_or_path.lower():
28 | pad_token = '<|endoftext|>'
29 | else:
30 | pad_token = None
31 |
32 | abbr = model_name_or_path.split('/')[-1]
33 | model = dict(
34 | type=HuggingFaceCausalLM,
35 | abbr=abbr,
36 | path=model_name_or_path,
37 | tokenizer_path=model_name_or_path,
38 | tokenizer_kwargs=dict(padding_side='left',
39 | truncation_side='left',
40 | use_fast=False,
41 | trust_remote_code=True,
42 | pad_token=pad_token
43 | ),
44 | max_out_len=100,
45 | max_seq_len=2048,
46 | batch_size=batch_size,
47 | model_kwargs=dict(device_map='auto', trust_remote_code=True),
48 | batch_padding=False, # if false, inference with for-loop without batch padding
49 | run_cfg=dict(num_gpus=2, num_procs=2),
50 | )
51 | models.append(model)
52 |
53 |
54 | # 指定评测集
55 | with read_base():
56 | from .datasets.ceval.ceval_ppl import ceval_datasets
57 | from .summarizers.example import summarizer
58 |
59 | datasets = [*ceval_datasets]
60 |
61 |
62 | # python run.py configs/eval_demo.py -w outputs/firefly
63 |
--------------------------------------------------------------------------------
/script/http/post.py:
--------------------------------------------------------------------------------
1 | import json
2 | import httpx
3 |
4 |
5 | def main():
6 | url = 'http://127.0.0.1:8877/firefly'
7 | timeout = 60 # 超时设置
8 |
9 | # 生成超参数
10 | max_new_tokens = 500
11 | top_p = 0.85
12 | temperature = 0.35
13 | repetition_penalty = 1.0
14 | do_sample = True
15 |
16 | inputs = '背诵李白的将进酒' # 请求内容
17 | inputs = inputs.strip()
18 |
19 | params = {
20 | "inputs": inputs,
21 | "max_new_tokens": max_new_tokens,
22 | "top_p": top_p,
23 | "temperature": temperature,
24 | "repetition_penalty": repetition_penalty,
25 | "do_sample": do_sample
26 | }
27 |
28 | timeout = httpx.Timeout(timeout)
29 | headers = {"Content-Type": "application/json", "Connection": "close"}
30 | session = httpx.Client(base_url="", headers=headers)
31 | response = session.request("POST", url, json=params, timeout=timeout)
32 | result = json.loads(response.text)['output']
33 | print(result)
34 |
35 |
36 | if __name__ == '__main__':
37 | main()
38 |
--------------------------------------------------------------------------------
/script/http/start_service.py:
--------------------------------------------------------------------------------
1 | from flask import Flask, request
2 | import json
3 | import torch
4 | from loguru import logger
5 | from peft import PeftModel
6 | from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
7 | app = Flask(__name__)
8 | app.config["JSON_AS_ASCII"] = False # 防止返回中文乱码
9 |
10 |
11 | @app.route('/firefly', methods=['POST'])
12 | def ds_llm():
13 | params = request.get_json()
14 | inputs = params.pop('inputs').strip()
15 |
16 | # chatglm使用官方的数据组织格式
17 | if model.config.model_type == 'chatglm':
18 | text = '[Round 1]\n\n问:{}\n\n答:'.format(inputs)
19 | input_ids = tokenizer(text, return_tensors="pt", add_special_tokens=False).input_ids.to(device)
20 | # 为了兼容qwen-7b,因为其对eos_token进行tokenize,无法得到对应的eos_token_id
21 | else:
22 | input_ids = tokenizer(inputs, return_tensors="pt", add_special_tokens=False).input_ids.to(device)
23 | bos_token_id = torch.tensor([[tokenizer.bos_token_id]], dtype=torch.long).to(device)
24 | eos_token_id = torch.tensor([[tokenizer.eos_token_id]], dtype=torch.long).to(device)
25 | input_ids = torch.concat([bos_token_id, input_ids, eos_token_id], dim=1)
26 |
27 | logger.info(params)
28 | input_ids = input_ids.to(device)
29 | with torch.no_grad():
30 | outputs = model.generate(input_ids=input_ids, eos_token_id=tokenizer.eos_token_id, **params)
31 | outputs = outputs.tolist()[0][len(input_ids[0]):]
32 | # response = tokenizer.batch_decode(outputs)
33 | response = tokenizer.decode(outputs)
34 | response = response.strip().replace(tokenizer.eos_token, "").strip()
35 |
36 | result = {
37 | 'input': inputs,
38 | 'output': response
39 | }
40 | with open(log_file, 'a', encoding='utf8') as f:
41 | data = json.dumps(result, ensure_ascii=False)
42 | f.write('{}\n'.format(data))
43 |
44 | return result
45 |
46 |
47 | if __name__ == '__main__':
48 | # 参数设置
49 | model_name_or_path = 'YeungNLP/firefly-baichuan-13b'
50 | log_file = 'service_history.txt'
51 | port = 8877
52 | device = 'cuda'
53 | logger.info(f"Starting to load the model {model_name_or_path} into memory")
54 |
55 | # 加载model和tokenizer
56 | model = AutoModelForCausalLM.from_pretrained(
57 | model_name_or_path,
58 | trust_remote_code=True,
59 | low_cpu_mem_usage=True,
60 | torch_dtype=torch.float16,
61 | device_map='auto'
62 | ).to(device).eval()
63 | tokenizer = AutoTokenizer.from_pretrained(
64 | model_name_or_path,
65 | trust_remote_code=True,
66 | # llama不支持fast
67 | use_fast=False if model.config.model_type == 'llama' else True
68 | )
69 | # QWenTokenizer比较特殊,pad_token_id、bos_token_id、eos_token_id均为None。eod_id对应的token为<|endoftext|>
70 | if tokenizer.__class__.__name__ == 'QWenTokenizer':
71 | tokenizer.pad_token_id = tokenizer.eod_id
72 | tokenizer.bos_token_id = tokenizer.eod_id
73 | tokenizer.eos_token_id = tokenizer.eod_id
74 |
75 | logger.info(f"Successfully loaded the model {model_name_or_path} into memory")
76 |
77 | # 计算模型参数量
78 | total = sum(p.numel() for p in model.parameters())
79 | print("Total model params: %.2fM" % (total / 1e6))
80 | model.eval()
81 |
82 | app.run(port=port)
83 |
--------------------------------------------------------------------------------
/script/merge_lora.py:
--------------------------------------------------------------------------------
1 | from peft import PeftModel
2 | from transformers import AutoModelForCausalLM, AutoTokenizer, AutoConfig
3 | import torch
4 | """
5 | 使用该脚本,将lora的权重合并大base model中
6 | """
7 |
8 |
9 | def merge_lora_to_base_model():
10 | model_name_or_path = 'baichuan-inc/baichuan-7B'
11 | adapter_name_or_path = 'YeungNLP/firefly-baichuan-7b-qlora-sft'
12 | save_path = 'checkpoint/firefly-baichuan-7b-qlora-sft-merge'
13 |
14 | config = AutoConfig.from_pretrained(model_name_or_path)
15 | tokenizer = AutoTokenizer.from_pretrained(
16 | adapter_name_or_path,
17 | trust_remote_code=True,
18 | # llama不支持fast
19 | use_fast=False if config.model_type == 'llama' else True
20 | )
21 | model = AutoModelForCausalLM.from_pretrained(
22 | model_name_or_path,
23 | trust_remote_code=True,
24 | low_cpu_mem_usage=True,
25 | torch_dtype=torch.float16,
26 | # device_map='auto',
27 | device_map={'': 'cpu'}
28 | )
29 | model = PeftModel.from_pretrained(model, adapter_name_or_path, device_map={'': 'cpu'})
30 | model = model.merge_and_unload()
31 |
32 | tokenizer.save_pretrained(save_path)
33 | model.save_pretrained(save_path)
34 |
35 |
36 | if __name__ == '__main__':
37 | merge_lora_to_base_model()
38 |
--------------------------------------------------------------------------------
/train.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | from loguru import logger
3 | import os
4 | from os.path import join
5 | import torch
6 | from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
7 | import bitsandbytes as bnb
8 | from component.collator import PretrainCollator, SFTDataCollator
9 | from component.argument import CustomizedArguments
10 | from component.template import template_dict
11 | from component.dataset import (
12 | UnifiedSFTDataset,
13 | ChatGLM2SFTDataset,
14 | ChatGLM3SFTDataset,
15 | UnifiedDPODataset
16 | )
17 | from transformers import (
18 | set_seed,
19 | HfArgumentParser,
20 | TrainingArguments,
21 | AutoTokenizer,
22 | AutoModelForCausalLM,
23 | AutoConfig,
24 | BitsAndBytesConfig,
25 | Trainer,
26 | AddedToken
27 | )
28 | import importlib
29 | if importlib.util.find_spec('unsloth') is not None:
30 | from unsloth import FastLanguageModel
31 | from datasets import load_dataset, concatenate_datasets
32 | import datasets
33 | from itertools import chain
34 | from tqdm import tqdm
35 | import json
36 | from trl import DPOTrainer, get_kbit_device_map
37 | import torch.nn as nn
38 |
39 | os.environ['TOKENIZERS_PARALLELISM'] = 'false'
40 |
41 |
42 | def setup_everything():
43 | parser = argparse.ArgumentParser()
44 | # parser.add_argument("--train_args_file", type=str, default='train_args/pretrain/full/bloom-1b1-pretrain-full.json', help="")
45 | parser.add_argument("--train_args_file", type=str, default='train_args/sft/qlora/qwen-7b-sft-qlora.json', help="")
46 | parser.add_argument("--local_rank", type=int, help="")
47 | args = parser.parse_args()
48 | train_args_file = args.train_args_file
49 | # 读取训练的参数配置
50 | parser = HfArgumentParser((CustomizedArguments, TrainingArguments))
51 | # 解析得到自定义参数,以及自带参数
52 | args, training_args = parser.parse_json_file(json_file=train_args_file)
53 | # 创建输出目录
54 | if not os.path.exists(training_args.output_dir):
55 | os.makedirs(training_args.output_dir)
56 | logger.add(join(training_args.output_dir, 'train.log'))
57 | logger.info("train_args:{}".format(training_args))
58 | # 加载训练配置文件
59 | with open(train_args_file, "r") as f:
60 | train_args = json.load(f)
61 | # 保存训练参数到输出目录
62 | with open(join(training_args.output_dir, 'train_args.json'), "w") as f:
63 | json.dump(train_args, f, indent=4)
64 | # 设置随机种子
65 | set_seed(training_args.seed)
66 |
67 | # check some setting
68 | assert args.task_type in ['pretrain', 'sft', 'dpo'], "task_type should be in ['pretrain', 'sft', 'dpo']"
69 | assert args.train_mode in ['full', 'lora', 'qlora'], "task_type should be in ['full', 'lora', 'qlora']"
70 | assert sum([training_args.fp16, training_args.bf16]) == 1, "only one of fp16 and bf16 can be True"
71 | # assert not (args.task_type == 'dpo' and args.use_unsloth), 'We have not tested Unsloth during DPO yet. Please set use_unsloth=False when task_type=dpo'
72 |
73 | return args, training_args
74 |
75 |
76 | def find_all_linear_names(model, train_mode):
77 | """
78 | 找出所有全连接层,为所有全连接添加adapter
79 | """
80 | assert train_mode in ['lora', 'qlora']
81 | cls = bnb.nn.Linear4bit if train_mode == 'qlora' else nn.Linear
82 | lora_module_names = set()
83 | for name, module in model.named_modules():
84 | if isinstance(module, cls):
85 | names = name.split('.')
86 | lora_module_names.add(names[0] if len(names) == 1 else names[-1])
87 |
88 | if 'lm_head' in lora_module_names: # needed for 16-bit
89 | lora_module_names.remove('lm_head')
90 | lora_module_names = list(lora_module_names)
91 | logger.info(f'LoRA target module names: {lora_module_names}')
92 | return lora_module_names
93 |
94 |
95 | def load_pretrain_dataset(training_args, args, tokenizer):
96 | """
97 | 多线程预处理预训练数据
98 | """
99 | def tokenize_function(examples):
100 | output = tokenizer(examples["text"])
101 | output = {'input_ids': output.input_ids}
102 | return output
103 |
104 | def group_texts(examples):
105 | # Concatenate all texts.
106 | concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()}
107 | total_length = len(concatenated_examples[list(examples.keys())[0]])
108 | # We drop the small remainder, we could add padding if the model supported it instead of this drop, you can
109 | # customize this part to your needs.
110 | if total_length >= max_seq_length:
111 | total_length = (total_length // max_seq_length) * max_seq_length
112 | # Split by chunks of max_len.
113 | result = {
114 | k: [t[i: i + max_seq_length] for i in range(0, total_length, max_seq_length)]
115 | for k, t in concatenated_examples.items()
116 | }
117 | return result
118 |
119 | data_path = args.train_file
120 | max_seq_length = args.max_seq_length
121 | # 创建缓存路径
122 | cache_dir = join(data_path, 'cache')
123 | os.makedirs(cache_dir, exist_ok=True)
124 | logger.info('Pretraining data path: {}'.format(data_path))
125 |
126 | # 扫描所有jsonl文件
127 | logger.info('Scanning all the training file...')
128 | files = []
129 | for root, dir_names, file_names in os.walk(data_path):
130 | for file_name in file_names:
131 | file = join(root, file_name)
132 | if file_name.endswith('.jsonl'):
133 | files.append(file)
134 | logger.info(f'Total num of training file: {len(files)}')
135 |
136 | # 预处理所有文本,将其id化,并且进行packing操作
137 | with training_args.main_process_first(desc="dataset map tokenization and grouping"):
138 | pretrain_dataset = [] # 汇总所有dataset
139 | for idx, file in enumerate(tqdm(files)):
140 | logger.info(f'Loading file: {file}')
141 | file_name = os.path.basename(file)
142 | file_name = file_name.replace('.jsonl', '')
143 | cache_path = os.path.join(cache_dir, file_name)
144 | os.makedirs(cache_path, exist_ok=True)
145 |
146 | try:
147 | processed_dataset = datasets.load_from_disk(cache_path, keep_in_memory=False)
148 | logger.info(f'Finished loading datasets-{file_name} from cache')
149 | except Exception:
150 | tmp_cache_path = join(cache_path, 'tmp') # 临时缓存目录,会被自动删除
151 | logger.info(f'There is no cache of file {file_name}, start preprocessing...')
152 | raw_dataset = load_dataset("json", data_files=file, cache_dir=tmp_cache_path, keep_in_memory=False)
153 | tokenized_dataset = raw_dataset.map(
154 | tokenize_function,
155 | batched=True,
156 | num_proc=args.tokenize_num_workers,
157 | remove_columns="text",
158 | load_from_cache_file=True,
159 | keep_in_memory=False,
160 | cache_file_names={k: os.path.join(tmp_cache_path, 'tokenized.arrow') for k in raw_dataset},
161 | desc="Running tokenizer on dataset",
162 | )
163 | grouped_datasets = tokenized_dataset.map(
164 | group_texts,
165 | batched=True,
166 | num_proc=args.tokenize_num_workers,
167 | load_from_cache_file=True,
168 | keep_in_memory=False,
169 | cache_file_names={k: os.path.join(tmp_cache_path, 'grouped.arrow') for k in tokenized_dataset},
170 | desc=f"Grouping texts in chunks of {max_seq_length}",
171 | )
172 | processed_dataset = grouped_datasets
173 | processed_dataset.save_to_disk(cache_path)
174 | # 删除临时目录
175 | # shutil.rmtree(tmp_cache_path)
176 |
177 | logger.info(f"Training number of {file_name}: {len(processed_dataset['train'])}")
178 | if idx == 0:
179 | pretrain_dataset = processed_dataset['train']
180 | else:
181 | assert pretrain_dataset.features.type == processed_dataset["train"].features.type
182 | pretrain_dataset = concatenate_datasets([pretrain_dataset, processed_dataset["train"]])
183 | logger.info(f"Total training number: {len(pretrain_dataset)}")
184 | return pretrain_dataset
185 |
186 |
187 | def load_tokenizer(args):
188 | config = AutoConfig.from_pretrained(args.model_name_or_path, trust_remote_code=True)
189 | # 加载tokenzier
190 | tokenizer = AutoTokenizer.from_pretrained(
191 | args.model_name_or_path,
192 | trust_remote_code=True,
193 | # llama不支持fast
194 | use_fast=False if config.model_type == 'llama' or config.model_type == 'internlm2' else True
195 | )
196 |
197 | # 部分模型的base与chat版本的tokenizer存在差异
198 | if 'internlm2' in args.model_name_or_path.lower():
199 | tokenizer._added_tokens_encoder.update({'<|im_start|>': 92543})
200 | tokenizer._added_tokens_encoder.update({'<|im_end|>': 92542})
201 | tokenizer._added_tokens_decoder.update({92543: AddedToken('<|im_start|>')})
202 | tokenizer._added_tokens_decoder.update({92542: AddedToken('<|im_end|>')})
203 | tokenizer.add_special_tokens({'additional_special_tokens': ['<|im_start|>', '<|im_end|>']})
204 | elif 'orion' in args.model_name_or_path.lower():
205 | tokenizer.add_special_tokens({'bos_token': '', 'eos_token': ''})
206 | elif 'gemma' in args.model_name_or_path.lower():
207 | tokenizer.add_special_tokens({'additional_special_tokens': ['', '']})
208 |
209 | if tokenizer.__class__.__name__ == 'QWenTokenizer':
210 | tokenizer.pad_token_id = tokenizer.eod_id
211 | tokenizer.bos_token_id = tokenizer.eod_id
212 | tokenizer.eos_token_id = tokenizer.eod_id
213 | if tokenizer.pad_token is None:
214 | tokenizer.pad_token = tokenizer.eos_token
215 | assert tokenizer.pad_token_id is not None, "pad_token_id should not be None"
216 | assert tokenizer.eos_token_id is not None, "eos_token_id should not be None"
217 | logger.info(f'vocab_size of tokenizer: {tokenizer.vocab_size}')
218 | return tokenizer
219 |
220 |
221 | def load_unsloth_model(args, training_args):
222 | model, tokenizer = FastLanguageModel.from_pretrained(
223 | model_name=args.model_name_or_path,
224 | max_seq_length=args.max_seq_length,
225 | dtype=None,
226 | trust_remote_code=True,
227 | load_in_4bit=True if args.train_mode == 'qlora' else False,
228 | )
229 | if args.train_mode in ['lora', 'qlora']:
230 | logger.info('Initializing PEFT Model...')
231 | target_modules = find_all_linear_names(model, args.train_mode)
232 | model = FastLanguageModel.get_peft_model(
233 | model,
234 | r=args.lora_rank,
235 | target_modules=target_modules,
236 | lora_alpha=args.lora_alpha,
237 | lora_dropout=args.lora_dropout,
238 | bias="none",
239 | use_gradient_checkpointing=True,
240 | random_state=training_args.seed,
241 | max_seq_length=args.max_seq_length,
242 | )
243 | logger.info(f'target_modules: {target_modules}')
244 | return {
245 | 'model': model,
246 | 'ref_model': None,
247 | 'peft_config': None
248 | }
249 |
250 |
251 | def load_model(args, training_args):
252 | """
253 | 加载模型
254 | """
255 | assert training_args.bf16 or training_args.fp16, 'bf16 or fp16 should be True'
256 | logger.info(f'Loading model from base model: {args.model_name_or_path}')
257 | logger.info(f'Train model with {args.train_mode}')
258 |
259 | # init model kwargs
260 | # todo add flash attention
261 | # attn_implementation = None
262 | torch_dtype = torch.float16 if training_args.fp16 else torch.bfloat16
263 | if args.train_mode == 'qlora':
264 | quantization_config = BitsAndBytesConfig(
265 | load_in_4bit=True,
266 | bnb_4bit_compute_dtype=torch.float16 if training_args.fp16 else torch.bfloat16,
267 | bnb_4bit_use_double_quant=True,
268 | bnb_4bit_quant_type="nf4",
269 | llm_int8_threshold=6.0,
270 | llm_int8_has_fp16_weight=False,
271 | )
272 | else:
273 | quantization_config = None
274 | model_kwargs = dict(
275 | trust_remote_code=True,
276 | # attn_implementation=attn_implementation,
277 | torch_dtype=torch_dtype,
278 | use_cache=False if training_args.gradient_checkpointing else True,
279 | device_map=get_kbit_device_map() if quantization_config is not None else None,
280 | quantization_config=quantization_config,
281 | )
282 | model = AutoModelForCausalLM.from_pretrained(args.model_name_or_path, **model_kwargs)
283 |
284 | # moe模型,需要考虑负载均衡的loss
285 | if 'output_router_logits' in model.config.to_dict():
286 | logger.info('set output_router_logits as True')
287 | model.config.output_router_logits = True
288 | # QLoRA: casts all the non int8 modules to full precision (fp32) for stability
289 | if args.train_mode == 'qlora' and args.task_type in ['pretrain', 'sft']:
290 | model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=training_args.gradient_checkpointing)
291 | # LoRA: Enables the gradients for the input embeddings
292 | if args.train_mode == 'lora' and args.task_type in ['pretrain', 'sft']:
293 | # For backward compatibility
294 | if hasattr(model, "enable_input_require_grads"):
295 | model.enable_input_require_grads()
296 | else:
297 | def make_inputs_require_grad(module, input, output):
298 | output.requires_grad_(True)
299 | model.get_input_embeddings().register_forward_hook(make_inputs_require_grad)
300 |
301 | # init peft_config
302 | if args.train_mode == 'full':
303 | peft_config = None
304 | else:
305 | # 找到所有需要插入adapter的全连接层
306 | target_modules = find_all_linear_names(model, args.train_mode)
307 | peft_config = LoraConfig(
308 | r=args.lora_rank,
309 | lora_alpha=args.lora_alpha,
310 | target_modules=target_modules,
311 | lora_dropout=args.lora_dropout,
312 | bias="none",
313 | task_type="CAUSAL_LM",
314 | )
315 |
316 | # init peft model
317 | if args.train_mode in ['lora', 'qlora'] and args.task_type in ['pretrain', 'sft']:
318 | model = get_peft_model(model, peft_config)
319 | logger.info(f'memory footprint of model: {model.get_memory_footprint() / (1024 * 1024 * 1024)} GB')
320 | model.print_trainable_parameters()
321 |
322 | # init ref_model
323 | if args.task_type == 'dpo':
324 | ref_model = AutoModelForCausalLM.from_pretrained(args.model_name_or_path, **model_kwargs) if args.train_mode == 'full' else None
325 | # pretrain和sft,不需要ref_model
326 | else:
327 | ref_model = None
328 |
329 | # 计算模型参数量
330 | total = sum(p.numel() for p in model.parameters())
331 | logger.info("Total model params: %.2fM" % (total / 1e6))
332 |
333 | return {
334 | 'model': model,
335 | 'ref_model': ref_model,
336 | 'peft_config': peft_config
337 | }
338 |
339 |
340 | def load_sft_dataset(args, tokenizer):
341 | if args.template_name not in template_dict.keys():
342 | raise Exception(f"template_name doesn't exist, all template_name: {template_dict.keys()}")
343 | template = template_dict[args.template_name]
344 | if 'chatglm2' in args.model_name_or_path.lower():
345 | logger.info('Loading data with ChatGLM2SFTDataset')
346 | train_dataset = ChatGLM2SFTDataset(args.train_file, tokenizer, args.max_seq_length, template)
347 | elif 'chatglm3' in args.model_name_or_path.lower():
348 | logger.info('Loading data with ChatGLM3SFTDataset')
349 | train_dataset = ChatGLM3SFTDataset(args.train_file, tokenizer, args.max_seq_length, template)
350 | else:
351 | logger.info('Loading data with UnifiedSFTDataset')
352 | train_dataset = UnifiedSFTDataset(args.train_file, tokenizer, args.max_seq_length, template)
353 | return train_dataset
354 |
355 |
356 | def load_dpo_dataset(args, tokenizer):
357 | if args.template_name not in template_dict.keys():
358 | raise Exception(f"template_name doesn't exist, all template_name: {template_dict.keys()}")
359 | template = template_dict[args.template_name]
360 | train_dataset = UnifiedDPODataset(args.train_file, tokenizer, args.max_seq_length, args.max_prompt_length, template)
361 | return train_dataset
362 |
363 |
364 | def init_components(args, training_args):
365 | """
366 | 初始化各个组件
367 | """
368 | training_args.ddp_find_unused_parameters = False
369 | logger.info('Initializing components...')
370 |
371 | # 加载tokenizer
372 | tokenizer = load_tokenizer(args)
373 | # 加载model
374 | if args.use_unsloth:
375 | components = load_unsloth_model(args, training_args)
376 | else:
377 | components = load_model(args, training_args)
378 | model = components['model']
379 | ref_model = components['ref_model']
380 | peft_config = components['peft_config']
381 |
382 | # 初始化dataset和collator
383 | if args.task_type == 'pretrain':
384 | logger.info('Train model with pretrain task')
385 | train_dataset = load_pretrain_dataset(training_args, args, tokenizer)
386 | data_collator = PretrainCollator(tokenizer, args.max_seq_length)
387 | elif args.task_type == 'sft':
388 | logger.info('Train model with sft task')
389 | train_dataset = load_sft_dataset(args, tokenizer)
390 | data_collator = SFTDataCollator(tokenizer, args.max_seq_length)
391 | else:
392 | logger.info('Train model with dpo task')
393 | train_dataset = load_dpo_dataset(args, tokenizer)
394 | data_collator = None
395 |
396 | # dpo
397 | if args.task_type == 'dpo':
398 | trainer = DPOTrainer(
399 | model,
400 | ref_model,
401 | args=training_args,
402 | beta=args.beta,
403 | train_dataset=train_dataset,
404 | data_collator=data_collator,
405 | tokenizer=tokenizer,
406 | peft_config=peft_config
407 | )
408 | # pretrain or sft
409 | else:
410 | trainer = Trainer(
411 | model=model,
412 | args=training_args,
413 | train_dataset=train_dataset,
414 | tokenizer=tokenizer,
415 | data_collator=data_collator,
416 | )
417 | return trainer
418 |
419 |
420 | def main():
421 | # 进行一些配置和检查
422 | args, training_args = setup_everything()
423 | # 加载各种组件
424 | trainer = init_components(args, training_args)
425 | # 开始训练
426 | logger.info("*** starting training ***")
427 | train_result = trainer.train()
428 | # 保存最好的checkpoint
429 | final_save_path = join(training_args.output_dir)
430 | trainer.save_model(final_save_path) # Saves the tokenizer too
431 | # 保存训练指标
432 | metrics = train_result.metrics
433 | trainer.log_metrics("train", metrics)
434 | trainer.save_metrics("train", metrics)
435 | trainer.save_state()
436 |
437 |
438 | if __name__ == "__main__":
439 | main()
440 |
--------------------------------------------------------------------------------
/train_args/dpo/full/minicpm-2b-dpo-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-minicpm-2b-dpo-full",
3 | "model_name_or_path": "openbmb/MiniCPM-2B-dpo-fp16",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "minicpm",
6 | "train_mode": "full",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 5e-7,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/dpo/full/minicpm3-4b-dpo-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-minicpm-2b-dpo-full",
3 | "model_name_or_path": "openbmb/MiniCPM3-4B",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "minicpm3",
6 | "train_mode": "full",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 5e-7,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/dpo/full/qwen1.5-7b-dpo-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen1.5-7b-dpo-full",
3 | "model_name_or_path": "Qwen/Qwen1.5-7B-Chat",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "qwen",
6 | "train_mode": "full",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 5e-7,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/dpo/lora/minicpm-2b-dpo-lora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-minicpm-2b-dpo-lora",
3 | "model_name_or_path": "openbmb/MiniCPM-2B-dpo-fp16",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "minicpm",
6 | "train_mode": "lora",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 2e-4,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/dpo/lora/minicpm3-4b-dpo-lora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-cpm3-4b-dpo-lora",
3 | "model_name_or_path": "openbmb/MiniCPM3-4B",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "minicpm3",
6 | "train_mode": "lora",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 2e-4,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/dpo/lora/qwen1.5-7b-dpo-lora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen1.5-7b-dpo-lora",
3 | "model_name_or_path": "Qwen/Qwen1.5-7B-Chat",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "qwen",
6 | "train_mode": "lora",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 2e-4,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/dpo/qlora/minicpm-2b-dpo-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-minicpm-2b-dpo-qlora",
3 | "model_name_or_path": "openbmb/MiniCPM-2B-dpo-fp16",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "minicpm",
6 | "train_mode": "qlora",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 2e-4,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/dpo/qlora/minicpm3-4b-dpo-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-cpm3-4b-dpo-qlora",
3 | "model_name_or_path": "openbmb/MiniCPM3-4B",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "minicpm3",
6 | "train_mode": "qlora",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 2e-4,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/dpo/qlora/qwen1.5-7b-dpo-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen1.5-7b-dpo-qlora",
3 | "model_name_or_path": "Qwen/Qwen1.5-7B-Chat",
4 | "train_file": "./data/dummy_dpo.jsonl",
5 | "template_name": "qwen",
6 | "train_mode": "qlora",
7 | "task_type": "dpo",
8 | "beta": 0.1,
9 | "num_train_epochs": 1,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 2e-4,
13 | "max_seq_length": 1024,
14 | "max_prompt_length": 300,
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "constant_with_warmup",
19 | "warmup_steps": 100,
20 | "lora_rank": 64,
21 | "lora_alpha": 16,
22 | "lora_dropout": 0.05,
23 |
24 | "gradient_checkpointing": true,
25 | "disable_tqdm": false,
26 | "optim": "paged_adamw_32bit",
27 | "seed": 42,
28 | "fp16": true,
29 | "report_to": "tensorboard",
30 | "dataloader_num_workers": 0,
31 | "save_strategy": "steps",
32 | "weight_decay": 0,
33 | "max_grad_norm": 0.3,
34 | "remove_unused_columns": false
35 | }
--------------------------------------------------------------------------------
/train_args/ds_z3_config.json:
--------------------------------------------------------------------------------
1 | {
2 | "gradient_accumulation_steps": "auto",
3 | "gradient_clipping": "auto",
4 | "steps_per_print": 200,
5 | "train_batch_size": "auto",
6 | "train_micro_batch_size_per_gpu": "auto",
7 | "wall_clock_breakdown": false,
8 |
9 | "optimizer": {
10 | "type": "Adam",
11 | "params": {
12 | "lr": "auto",
13 | "betas": "auto",
14 | "eps": "auto",
15 | "weight_decay": "auto"
16 | }
17 | },
18 | "fp16": {
19 | "enabled": "auto",
20 | "loss_scale": 0,
21 | "loss_scale_window": 1000,
22 | "initial_scale_power": 16,
23 | "hysteresis": 2,
24 | "min_loss_scale": 1
25 | },
26 | "zero_optimization": {
27 | "stage": 3,
28 | "offload_optimizer": {
29 | "device": "cpu",
30 | "pin_memory": true
31 | },
32 | "offload_param": {
33 | "device": "cpu",
34 | "pin_memory": true
35 | },
36 | "overlap_comm": true,
37 | "contiguous_gradients": true,
38 | "sub_group_size": 1e9,
39 | "reduce_bucket_size": "auto",
40 | "stage3_prefetch_bucket_size": "auto",
41 | "stage3_param_persistence_threshold": "auto",
42 | "stage3_max_live_parameters": 1e9,
43 | "stage3_max_reuse_distance": 1e9,
44 | "stage3_gather_16bit_weights_on_model_save": true
45 | },
46 | "scheduler": {
47 | "type": "WarmupLR",
48 | "params": {
49 | "warmup_min_lr": "auto",
50 | "warmup_max_lr": "auto",
51 | "warmup_num_steps": "auto"
52 | }
53 | }
54 | }
--------------------------------------------------------------------------------
/train_args/pretrain/full/bloom-1b1-pretrain-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-bloom-1b1-pretrain-full",
3 | "model_name_or_path": "bigscience/bloom-1b1",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/pretrain",
6 | "train_mode": "full",
7 | "task_type": "pretrain",
8 | "num_train_epochs": 1,
9 | "tokenize_num_workers": 10,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 1e-5,
13 | "max_seq_length": 1024,
14 |
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "cosine",
19 | "warmup_ratio": 0.01,
20 |
21 | "gradient_checkpointing": true,
22 | "logging_first_step": false,
23 | "disable_tqdm": false,
24 | "optim": "adamw_hf",
25 | "seed": 42,
26 | "fp16": true,
27 | "report_to": "tensorboard",
28 | "dataloader_num_workers": 0,
29 | "save_strategy": "steps",
30 | "weight_decay": 0,
31 | "max_grad_norm": 1.0,
32 | "remove_unused_columns": false
33 | }
--------------------------------------------------------------------------------
/train_args/pretrain/full/bloom-3b-pretrain-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-bloom-3b-pretrain-full",
3 | "model_name_or_path": "bigscience/bloom-3b",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/pretrain",
6 | "train_mode": "full",
7 | "task_type": "pretrain",
8 | "num_train_epochs": 1,
9 | "tokenize_num_workers": 10,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 1e-5,
13 | "max_seq_length": 1024,
14 |
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "cosine",
19 | "warmup_ratio": 0.01,
20 |
21 | "gradient_checkpointing": true,
22 | "logging_first_step": false,
23 | "disable_tqdm": false,
24 | "optim": "adamw_hf",
25 | "seed": 42,
26 | "fp16": true,
27 | "report_to": "tensorboard",
28 | "dataloader_num_workers": 0,
29 | "save_strategy": "steps",
30 | "weight_decay": 0,
31 | "max_grad_norm": 1.0,
32 | "remove_unused_columns": false
33 | }
--------------------------------------------------------------------------------
/train_args/pretrain/full/minicpm3-4b-pretrain-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-cpm3-4b-pretrain-full",
3 | "model_name_or_path": "openbmb/MiniCPM3-4B",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/pretrain",
6 | "train_mode": "full",
7 | "task_type": "pretrain",
8 | "num_train_epochs": 1,
9 | "tokenize_num_workers": 10,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 1e-5,
13 | "max_seq_length": 2048,
14 |
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "cosine",
19 | "warmup_ratio": 0.01,
20 |
21 | "gradient_checkpointing": true,
22 | "logging_first_step": false,
23 | "disable_tqdm": false,
24 | "optim": "adamw_hf",
25 | "seed": 42,
26 | "fp16": true,
27 | "report_to": "tensorboard",
28 | "dataloader_num_workers": 0,
29 | "save_strategy": "steps",
30 | "weight_decay": 0,
31 | "max_grad_norm": 1.0,
32 | "remove_unused_columns": false
33 | }
--------------------------------------------------------------------------------
/train_args/pretrain/full/qwen-7b-pretrain-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen-7b-pretrain-full",
3 | "model_name_or_path": "Qwen/Qwen-7B",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/pretrain",
6 | "train_mode": "full",
7 | "task_type": "pretrain",
8 | "num_train_epochs": 1,
9 | "tokenize_num_workers": 10,
10 | "per_device_train_batch_size": 1,
11 | "gradient_accumulation_steps": 16,
12 | "learning_rate": 1e-5,
13 | "max_seq_length": 2048,
14 |
15 | "logging_steps": 100,
16 | "save_steps": 100,
17 | "save_total_limit": 1,
18 | "lr_scheduler_type": "cosine",
19 | "warmup_ratio": 0.01,
20 |
21 | "gradient_checkpointing": true,
22 | "logging_first_step": false,
23 | "disable_tqdm": false,
24 | "optim": "adamw_hf",
25 | "seed": 42,
26 | "fp16": true,
27 | "report_to": "tensorboard",
28 | "dataloader_num_workers": 0,
29 | "save_strategy": "steps",
30 | "weight_decay": 0,
31 | "max_grad_norm": 1.0,
32 | "remove_unused_columns": false
33 | }
--------------------------------------------------------------------------------
/train_args/pretrain/qlora/bloom-3b-pretrain-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-bloom-3b-pretrain-qlora",
3 | "model_name_or_path": "bigscience/bloom-3b",
4 | "train_file": "./data/pretrain",
5 | "train_mode": "qlora",
6 | "task_type": "pretrain",
7 | "num_train_epochs": 1,
8 | "tokenize_num_workers": 10,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 2048,
13 |
14 | "logging_steps": 100,
15 | "save_steps": 100,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_ratio": 0.01,
18 |
19 | "gradient_checkpointing": true,
20 | "logging_first_step": false,
21 | "disable_tqdm": false,
22 | "optim": "adamw_hf",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 1.0,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/pretrain/qlora/minicpm3-4b-pretrain-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-cpm3-4b-pretrain-qlora",
3 | "model_name_or_path": "openbmb/MiniCPM3-4B",
4 | "train_file": "./data/pretrain",
5 | "train_mode": "qlora",
6 | "task_type": "pretrain",
7 | "num_train_epochs": 1,
8 | "tokenize_num_workers": 10,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 2048,
13 |
14 | "logging_steps": 100,
15 | "save_steps": 100,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_ratio": 0.01,
18 |
19 | "gradient_checkpointing": true,
20 | "logging_first_step": false,
21 | "disable_tqdm": false,
22 | "optim": "adamw_hf",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 1.0,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/pretrain/qlora/qwen-7b-pretrain-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen-7b-pretrain-qlora",
3 | "model_name_or_path": "Qwen/Qwen-7B",
4 | "train_file": "./data/pretrain",
5 | "train_mode": "qlora",
6 | "task_type": "pretrain",
7 | "num_train_epochs": 1,
8 | "tokenize_num_workers": 10,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 2048,
13 |
14 | "logging_steps": 100,
15 | "save_steps": 100,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_ratio": 0.01,
18 |
19 | "gradient_checkpointing": true,
20 | "logging_first_step": false,
21 | "disable_tqdm": false,
22 | "optim": "adamw_hf",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 1.0,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/pretrain/qlora/yi-6b-pretrain-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-yi-6b-pretrain-qlora",
3 | "model_name_or_path": "01-ai/Yi-6B",
4 | "train_file": "./data/pretrain",
5 | "train_mode": "qlora",
6 | "task_type": "pretrain",
7 | "num_train_epochs": 1,
8 | "tokenize_num_workers": 10,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 2048,
13 |
14 | "logging_steps": 100,
15 | "save_steps": 100,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_ratio": 0.01,
18 |
19 | "gradient_checkpointing": true,
20 | "logging_first_step": false,
21 | "disable_tqdm": false,
22 | "optim": "adamw_hf",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 1.0,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/full/bloom-1b1-sft-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-bloom-1b1-sft-full",
3 | "model_name_or_path": "bigscience/bloom-1b1",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/dummy_data.jsonl",
6 | "template_name": "default",
7 | "train_mode": "full",
8 | "num_train_epochs": 1,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 1024,
13 | "logging_steps": 100,
14 | "save_steps": 100,
15 | "save_total_limit": 1,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_steps": 100,
18 |
19 | "gradient_checkpointing": true,
20 | "disable_tqdm": false,
21 | "optim": "adamw_hf",
22 | "seed": 42,
23 | "fp16": true,
24 | "report_to": "tensorboard",
25 | "dataloader_num_workers": 0,
26 | "save_strategy": "steps",
27 | "weight_decay": 0,
28 | "max_grad_norm": 1.0,
29 | "remove_unused_columns": false
30 | }
--------------------------------------------------------------------------------
/train_args/sft/full/bloom-3b-sft-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-bloom-3b-sft-full",
3 | "model_name_or_path": "bigscience/bloom-3b",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/dummy_data.jsonl",
6 | "template_name": "default",
7 | "train_mode": "full",
8 | "num_train_epochs": 1,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 1024,
13 | "logging_steps": 100,
14 | "save_steps": 100,
15 | "save_total_limit": 1,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_steps": 100,
18 |
19 | "gradient_checkpointing": true,
20 | "disable_tqdm": false,
21 | "optim": "adamw_hf",
22 | "seed": 42,
23 | "fp16": true,
24 | "report_to": "tensorboard",
25 | "dataloader_num_workers": 0,
26 | "save_strategy": "steps",
27 | "weight_decay": 0,
28 | "max_grad_norm": 1.0,
29 | "remove_unused_columns": false
30 | }
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/train_args/sft/full/minicpm-2b-sft-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-minicpm-2b-sft-full",
3 | "model_name_or_path": "openbmb/MiniCPM-2B-dpo-fp16",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/dummy_data.jsonl",
6 | "template_name": "minicpm",
7 | "train_mode": "full",
8 | "num_train_epochs": 1,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 1024,
13 | "logging_steps": 100,
14 | "save_steps": 100,
15 | "save_total_limit": 1,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_steps": 100,
18 |
19 | "gradient_checkpointing": true,
20 | "disable_tqdm": false,
21 | "optim": "adamw_hf",
22 | "seed": 42,
23 | "fp16": true,
24 | "report_to": "tensorboard",
25 | "dataloader_num_workers": 0,
26 | "save_strategy": "steps",
27 | "weight_decay": 0,
28 | "max_grad_norm": 1.0,
29 | "remove_unused_columns": false
30 | }
--------------------------------------------------------------------------------
/train_args/sft/full/minicpm3-4b-sft-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-cpm-4b-sft-full",
3 | "model_name_or_path": "openbmb/MiniCPM3-4B",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/dummy_data.jsonl",
6 | "template_name": "minicpm3",
7 | "train_mode": "full",
8 | "num_train_epochs": 1,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 1024,
13 | "logging_steps": 100,
14 | "save_steps": 100,
15 | "save_total_limit": 1,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_steps": 100,
18 |
19 | "gradient_checkpointing": true,
20 | "disable_tqdm": false,
21 | "optim": "adamw_hf",
22 | "seed": 42,
23 | "fp16": true,
24 | "report_to": "tensorboard",
25 | "dataloader_num_workers": 0,
26 | "save_strategy": "steps",
27 | "weight_decay": 0,
28 | "max_grad_norm": 1.0,
29 | "remove_unused_columns": false
30 | }
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/train_args/sft/full/qwen-7b-sft-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen-7b-sft-full",
3 | "model_name_or_path": "Qwen/Qwen-7B-Chat",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/dummy_data.jsonl",
6 | "template_name": "qwen",
7 | "train_mode": "full",
8 | "num_train_epochs": 1,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 1024,
13 | "logging_steps": 100,
14 | "save_steps": 100,
15 | "save_total_limit": 1,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_steps": 100,
18 |
19 | "gradient_checkpointing": true,
20 | "disable_tqdm": false,
21 | "optim": "adamw_hf",
22 | "seed": 42,
23 | "fp16": true,
24 | "report_to": "tensorboard",
25 | "dataloader_num_workers": 0,
26 | "save_strategy": "steps",
27 | "weight_decay": 0,
28 | "max_grad_norm": 1.0,
29 | "remove_unused_columns": false
30 | }
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/train_args/sft/full/yi-6b-sft-full.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-yi-6b-sft-full",
3 | "model_name_or_path": "01-ai/Yi-6B-Chat",
4 | "deepspeed": "./train_args/ds_z3_config.json",
5 | "train_file": "./data/dummy_data.jsonl",
6 | "template_name": "yi",
7 | "train_mode": "full",
8 | "num_train_epochs": 1,
9 | "per_device_train_batch_size": 1,
10 | "gradient_accumulation_steps": 16,
11 | "learning_rate": 1e-5,
12 | "max_seq_length": 1024,
13 | "logging_steps": 100,
14 | "save_steps": 100,
15 | "save_total_limit": 1,
16 | "lr_scheduler_type": "cosine",
17 | "warmup_steps": 100,
18 |
19 | "gradient_checkpointing": true,
20 | "disable_tqdm": false,
21 | "optim": "adamw_hf",
22 | "seed": 42,
23 | "fp16": true,
24 | "report_to": "tensorboard",
25 | "dataloader_num_workers": 0,
26 | "save_strategy": "steps",
27 | "weight_decay": 0,
28 | "max_grad_norm": 1.0,
29 | "remove_unused_columns": false
30 | }
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/train_args/sft/lora/bloom-7b1-sft-lora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-bloom-7b1-sft-lora",
3 | "model_name_or_path": "bigscience/bloom-7b1",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "default",
6 | "train_mode": "lora",
7 | "num_train_epochs": 1,
8 | "per_device_train_batch_size": 1,
9 | "gradient_accumulation_steps": 16,
10 | "learning_rate": 2e-4,
11 | "max_seq_length": 1024,
12 | "logging_steps": 100,
13 | "save_steps": 100,
14 | "save_total_limit": 1,
15 | "lr_scheduler_type": "constant_with_warmup",
16 | "warmup_steps": 100,
17 | "lora_rank": 64,
18 | "lora_alpha": 16,
19 | "lora_dropout": 0.05,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/lora/minicpm3-4b-sft-lora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-cpm3-4b-sft-lora",
3 | "model_name_or_path": "openbmb/MiniCPM3-4B",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "minicpm3",
6 | "train_mode": "lora",
7 | "num_train_epochs": 1,
8 | "per_device_train_batch_size": 1,
9 | "gradient_accumulation_steps": 16,
10 | "learning_rate": 2e-4,
11 | "max_seq_length": 1024,
12 | "logging_steps": 100,
13 | "save_steps": 100,
14 | "save_total_limit": 1,
15 | "lr_scheduler_type": "constant_with_warmup",
16 | "warmup_steps": 100,
17 | "lora_rank": 64,
18 | "lora_alpha": 16,
19 | "lora_dropout": 0.05,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/lora/qwen1.5-7b-sft-lora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen1.5-7b-sft-lora",
3 | "model_name_or_path": "Qwen/Qwen1.5-7B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "qwen",
6 | "train_mode": "lora",
7 | "num_train_epochs": 1,
8 | "per_device_train_batch_size": 1,
9 | "gradient_accumulation_steps": 16,
10 | "learning_rate": 2e-4,
11 | "max_seq_length": 1024,
12 | "logging_steps": 100,
13 | "save_steps": 100,
14 | "save_total_limit": 1,
15 | "lr_scheduler_type": "constant_with_warmup",
16 | "warmup_steps": 100,
17 | "lora_rank": 64,
18 | "lora_alpha": 16,
19 | "lora_dropout": 0.05,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/baichuan-13b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-baichuan-13b-sft-qlora",
3 | "model_name_or_path": "baichuan-inc/Baichuan-13B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "baichuan",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 5,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/baichuan-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-baichuan-7b-sft-qlora",
3 | "model_name_or_path": "baichuan-inc/baichuan-7B",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "baichuan",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/baichuan2-13b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-baichuan2-13b-sft-qlora",
3 | "model_name_or_path": "baichuan-inc/Baichuan2-13B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "baichuan2",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/baichuan2-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-baichuan2-7b-sft-qlora",
3 | "model_name_or_path": "baichuan-inc/Baichuan2-7B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "baichuan2",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/bloom-7b1-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-bloom-7b1-sft-qlora",
3 | "model_name_or_path": "bigscience/bloom-7b1",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "default",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/chatglm2-6b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-chatglm2-6b-sft-qlora",
3 | "model_name_or_path": "THUDM/chatglm2-6b",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "chatglm2",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/chatglm3-6b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-chatglm3-6b-sft-qlora",
3 | "model_name_or_path": "THUDM/chatglm3-6b",
4 | "train_file": "./data/dummy_data_chatglm3.jsonl",
5 | "template_name": "chatglm3",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/deepseek-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-deepseek-7b-sft-qlora",
3 | "model_name_or_path": "deepseek-ai/deepseek-llm-7b-chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "deepseek",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/deepseek-moe-16b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-deepseek-moe-16b-sft-qlora",
3 | "model_name_or_path": "deepseek-ai/deepseek-moe-16b-chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "deepseek",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/gemma-2b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-gemma-2b-sft-qlora",
3 | "model_name_or_path": "google/gemma-2b-it",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "gemma",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": true,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/gemma-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-gemma-7b-sft-qlora",
3 | "model_name_or_path": "google/gemma-7b-it",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "gemma",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": true,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/internlm-20b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-internlm-20b-sft-qlora",
3 | "model_name_or_path": "internlm/internlm-chat-20b",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "internlm",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/internlm-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-internlm-7b-sft-qlora",
3 | "model_name_or_path": "internlm/internlm-chat-7b",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "internlm",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/internlm2-20b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-internlm2-20b-sft-qlora",
3 | "model_name_or_path": "internlm/internlm2-chat-20b",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "internlm2",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/internlm2-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-internlm2-7b-sft-qlora",
3 | "model_name_or_path": "internlm/internlm2-chat-7b",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "internlm2",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/llama2-13b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-llama2-13b-sft-qlora",
3 | "model_name_or_path": "NousResearch/Llama-2-13b-chat-hf",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "llama2",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/llama2-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-llama2-7b-sft-qlora",
3 | "model_name_or_path": "NousResearch/Llama-2-7b-chat-hf",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "llama2",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 10,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/llama3-8b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-llama3-8b-sft-qlora",
3 | "model_name_or_path": "NousResearch/Meta-Llama-3-8B-Instruct",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "llama3",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": true,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 10,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/minicpm-2b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-minicpm-2b-sft-qlora",
3 | "model_name_or_path": "openbmb/MiniCPM-2B-dpo-fp16",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "minicpm",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/minicpm3-4b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-cpm3-4b-sft-qlora",
3 | "model_name_or_path": "openbmb/MiniCPM3-4B",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "minicpm3",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": false,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/mistral-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-mistral-7b-sft-qlora",
3 | "model_name_or_path": "mistralai/Mistral-7B-Instruct-v0.1",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "mistral",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": true,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/mixtral-8x7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-mixtral-8x7b-sft-qlora",
3 | "model_name_or_path": "mistralai/Mixtral-8x7B-Instruct-v0.1",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "mixtral",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 16,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/orion-14b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-orion-14b-sft-qlora",
3 | "model_name_or_path": "OrionStarAI/Orion-14B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "orion",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/phi3-3.8b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-phi3-3.8b-sft-qlora",
3 | "model_name_or_path": "microsoft/Phi-3-mini-128k-instruct",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "phi3",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/qwen-14b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen-14b-sft-qlora",
3 | "model_name_or_path": "Qwen/Qwen-14B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "qwen",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/qwen-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen-7b-sft-qlora",
3 | "model_name_or_path": "Qwen/Qwen-7B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "qwen",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/qwen1.5-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen1.5-7b-sft-qlora",
3 | "model_name_or_path": "Qwen/Qwen1.5-7B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "qwen",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": false,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/qwen1.5-moe-2.7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen1.5-moe-2.7b-sft-qlora",
3 | "model_name_or_path": "Qwen/Qwen1.5-MoE-A2.7B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "qwen",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/qwen2-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen2-7b-sft-qlora",
3 | "model_name_or_path": "Qwen/Qwen2-7B-Instruct",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "qwen",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": false,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/qwen2.5-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-qwen2.5-7b-sft-qlora",
3 | "model_name_or_path": "Qwen/Qwen2.5-7B-Instruct",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "qwen",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": true,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
33 |
--------------------------------------------------------------------------------
/train_args/sft/qlora/vicuna-13b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-vicuna-13b-sft-qlora",
3 | "model_name_or_path": "lmsys/vicuna-13b-v1.5",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "vicuna",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 5,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/vicuna-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-vicuna-7b-sft-qlora",
3 | "model_name_or_path": "lmsys/vicuna-7b-v1.5",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "vicuna",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 5,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/xverse-13b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-xverse-13b-sft-qlora",
3 | "model_name_or_path": "xverse/XVERSE-13B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "xverse",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 5,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/xverse-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-xverse-7b-sft-qlora",
3 | "model_name_or_path": "xverse/XVERSE-7B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "xverse",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 5,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/yi-34b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-yi-34b-sft-qlora",
3 | "model_name_or_path": "01-ai/Yi-34B",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "yi",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/yi-6b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-yi-6b-sft-qlora",
3 | "model_name_or_path": "01-ai/Yi-6B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "yi",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/yi1.5-6b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-yi1.5-6b-sft-qlora",
3 | "model_name_or_path": "01-ai/Yi-1.5-6B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "yi",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 0,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/zephyr-7b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-zephyr-7b-sft-qlora",
3 | "model_name_or_path": "HuggingFaceH4/zephyr-7b-beta",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "zephyr",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 2e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 | "use_unsloth": true,
20 |
21 | "gradient_checkpointing": true,
22 | "disable_tqdm": false,
23 | "optim": "paged_adamw_32bit",
24 | "seed": 42,
25 | "fp16": true,
26 | "report_to": "tensorboard",
27 | "dataloader_num_workers": 0,
28 | "save_strategy": "steps",
29 | "weight_decay": 0,
30 | "max_grad_norm": 0.3,
31 | "remove_unused_columns": false
32 | }
--------------------------------------------------------------------------------
/train_args/sft/qlora/ziya2-13b-sft-qlora.json:
--------------------------------------------------------------------------------
1 | {
2 | "output_dir": "output/firefly-ziya2-13b-sft-qlora",
3 | "model_name_or_path": "IDEA-CCNL/Ziya2-13B-Chat",
4 | "train_file": "./data/dummy_data.jsonl",
5 | "template_name": "ziya2",
6 | "num_train_epochs": 1,
7 | "per_device_train_batch_size": 1,
8 | "gradient_accumulation_steps": 16,
9 | "learning_rate": 1e-4,
10 | "max_seq_length": 1024,
11 | "logging_steps": 100,
12 | "save_steps": 100,
13 | "save_total_limit": 1,
14 | "lr_scheduler_type": "constant_with_warmup",
15 | "warmup_steps": 100,
16 | "lora_rank": 64,
17 | "lora_alpha": 16,
18 | "lora_dropout": 0.05,
19 |
20 | "gradient_checkpointing": true,
21 | "disable_tqdm": false,
22 | "optim": "paged_adamw_32bit",
23 | "seed": 42,
24 | "fp16": true,
25 | "report_to": "tensorboard",
26 | "dataloader_num_workers": 10,
27 | "save_strategy": "steps",
28 | "weight_decay": 0,
29 | "max_grad_norm": 0.3,
30 | "remove_unused_columns": false
31 | }
--------------------------------------------------------------------------------