noforit commited on
Commit
21a8e9e
1 Parent(s): b0be9a1

Upload README.md

Browse files
Files changed (1) hide show
  1. README.md +28 -101
README.md CHANGED
@@ -16,13 +16,16 @@
16
  <a href="https://mp.weixin.qq.com/s/T24_U-aR1WuwQh9iDjCWCg" target="_blank" style="margin: 2px;">
17
  <img alt="Wechat" src="https://img.shields.io/badge/Abacus-Wechat-%23368B13?logo=wechat&logoColor=%23368B13" style="display: inline-block; vertical-align: middle;"/>
18
  </a>
 
 
 
 
19
  <a href="LICENSE" style="margin: 2px;">
20
  <img alt="Code License" src="https://img.shields.io/badge/License-Apache_2.0-green.svg" style="display: inline-block; vertical-align: middle;"/>
21
  </a>
22
  </div>
23
 
24
 
25
-
26
  ---
27
 
28
  - [引言](#1引言)
@@ -34,14 +37,11 @@
34
  - [VSCode插件](#7VSCode插件)
35
 
36
  ## 1.引言
37
-
38
- 从DeepMind发布的AlphaCode在竞赛级编程能力上超越人类平均水平之日起,代码大模型便广受关注。与此同时,OpenAI发布的CodeX更是展示出了代码大模型具有超越传统编程范畴的数值推理、逻辑推断、工具调用等高阶能力,进一步引爆了对该领域的研究与讨论。以BigCode StarCoder为代表的开源项目对完善该领域的研究生态做出了卓越的贡献。然而,目前开源代码大模型提升编程能力的同时会严重损害通用语言能力。为此,哈尔滨工业大学社会计算与信息检索研究中心(HIT-SCIR)推出了<strong>“珠算”代码大模型</strong>,其以2.7B参数在**代码与通用语言平均性能上**均超越了DeepSeek-Coder-1.3B、Yi-Coder-1.5B、Stable Code-3B、Granite-3B-Code等参数量3B及以下的代码大模型,希望通过**开放权重、训练细节以及配套的微调适配平台与插件**,助力开源社区的发展。
39
-
40
  <p align="center">
41
  <img width="60%" src="picture/3-1.png">
42
  </p>
43
 
44
-
45
  - 珠算大模型在国内外3B量级代码大模型中具有最优的代码和通用语言能力。
46
  - 基于珠算大模型的编程辅助工具可以在VSCode内一键安装,支持代码生成与补全等应用。
47
 
@@ -50,47 +50,38 @@
50
 
51
  <div align="center">
52
 
53
-
54
- | 模型名称 | 文件大小 | 下载地址 | 备注 |
55
- | :---------: | :--------------------------: | :----------------------------------------------------------: | :---------------------------------------------: |
56
- | Abacus | 5GB | [🤗HuggingFace](https://huggingface.co/HIT-SCIR/Abacus)<br>[ModelScope](https://www.modelscope.cn/models/HIT-SCIR/Abacus) | Abacus完整模型 |
57
- | Abacus-gguf | 1.7GB(Q4_K_M)<br>2.7GB(Q8_0) | [🤗HuggingFace](https://huggingface.co/HIT-SCIR/Abacus-gguf)<br>[ModelScope](https://www.modelscope.cn/models/HIT-SCIR/Abacus-gguf) | 珠算GGUF版本,适用于llama.cpp、Ollama等推理框架 |
58
 
59
  </div>
60
 
61
 
62
 
63
  ## 3.模型评价
64
-
65
  #### 代码生成能力
66
-
67
  模型代码生成能力的评估主要基于以下评测基准:
68
-
69
  - HumanEval:由 164 道原创编程题组成的评测基准,通过衡量从文档字符串生成程序的功能正确性,评估语言理解、算法和简单的数学能力。
70
  - HumanEval+:HumanEval+将原始HumanEval中164道问题的单元测试的规模增加了80倍,用于严格评估 LLM 生成代码的功能正确性。
71
  - MBPP(sanitized):Python编程任务评测基准,经过人工验证后的MBPP子集,删减修改了原始MBPP中描述模糊、错误、不符合正常习惯的问题。
72
  - MBPP+:精简了原始MBPP中的问题数量,并将单元测试的规模增加35倍,用于严格评估 LLM 生成代码的功能正确性。
73
  - LiveCodeBench:旨在为 LLM 提供全面、公平的竞赛编程评估。 通过持续收集LeetCode、AtCoder和CodeForces竞赛平台的新问题,形成了动态的综合基准库。 为了确保数据不受污染,我们选择了 2024 年 1 月至 9 月的问题进行测试。
74
-
75
  <div align="center">
76
 
77
-
78
- | 模型名称 | HumanEval | HumanEval+ | MBPP(sanitized) | MBPP+ | LiveCodeBench | AVG |
79
- | :--------------------------: | :-------: | :--------: | :-------------: | :-------: | :-----------: | :-------- |
80
- | Granite-3B-Code-Instruct | 45.73 | 39.63 | 53.70 | 41.10 | 7.46 | 37.52 |
81
- | Stable-Code-Instruct-3B | 67.07 | 56.71 | 57.20 | 37.59 | **11.43** | 46.00 |
82
- | Yi-Coder-1.5B-Chat | 67.68 | 60.37 | **61.87** | **48.37** | 8.22 | 49.30 |
83
- | DeepSeek-Coder-1.3B-Instruct | 65.24 | 59.15 | 56.03 | 45.36 | 7.00 | 46.56 |
84
- | 珠算 | **71.95** | **65.85** | 57.98 | 43.36 | 9.06 | **49.64** |
85
-
86
  </div>
87
 
88
  **在国内外3B以下代码大模型中,珠算大模型在五个主流代码评测基准上的综合表现达到最佳**,各项指标均处于领先水平。其中,在Humaneval和Humaneval+基准上的表现尤为突出;在MBPP(sanitized)和MBPP+基准上的表现略逊于最新发布的Yi-Coder-1.5B-chat;而在LiveCodeBench基准上的表现仅次于Stable-Code-Instruct-3B。
89
 
90
  #### 3.2 通用语言能力
91
-
92
  通用语言能力的评估主要基于以下评测基准:
93
-
94
  - MMLU:包含57个多选任务的英文评测基准,涵盖初等数学、美国历史、计算机科学、法律等,难度覆盖高中水平到专家水平,是目前主流的LLM评测基准之一。
95
  - HellaSwag:极具挑战的英文NLI评测基准,需要对上下文进行深入理解,无法基于常识直接回答。
96
  - ARC-e:多项选择题的问答评测基准,包含了从三年级到九年级的科学考试题目。ARC-e(easy) 是其中的一个简单难度测试子集。
@@ -98,27 +89,23 @@
98
  - C-Eval:全面的中文LLM评估基准,包含了13,948个多项选择题,涵盖了52个不同的学科和四个难度级别。
99
  - CMMLU:综合性中文评估基准,用于评估语言模型在中文语境下的知识和推理能力,涵盖了从基础学科到高级专业水平的67个主题。
100
  - GSM8K:高质量小学数学应用题评测基准,需要2到8个步骤来解决,解决方案主要涉及基本算术运算,可用于评价多步数学推理能力。
101
-
102
  <div align="center">
 
103
 
104
-
105
-
106
- | 模型名称 | MMLU | HellaSwag | ARC-e | BBH | C-Eval | CMMLU | GSM8K | AVG |
107
- | :--------------------------: | :-------: | :-------: | :-------: | :-------: | :-------: | :-------: | :-------: | :-------: |
108
- | Granite-3B-Code-Instruct | 29.95 | 26.82 | 47.62 | 35.87 | 32.30 | 30.77 | **56.48** | 37.12 |
109
- | Stable-Code-Instruct-3B | 29.34 | 32.15 | 34.74 | 21.69 | 28.61 | 29.18 | 15.92 | 27.37 |
110
- | Yi-Coder-1.5B-Chat | 33.98 | 28.52 | 40.04 | 34.40 | 31.88 | 31.88 | 10.16 | 30.12 |
111
- | DeepSeek-Coder-1.3B-Instruct | 26.68 | 25.25 | 27.69 | 7.48 | 25.61 | 26.88 | 9.63 | 21.32 |
112
- | 珠算 | **40.18** | **53.23** | **66.67** | **36.08** | **36.00** | **36.84** | 46.32 | **45.05** |
113
 
114
  </div>
115
 
116
  **在国内外3B以下代码大模型中,珠算大模型在七个主流通用语言评测基准上的综合表现达到最佳**,且具有明显优势。除在数学推理GSM8K基准上低于Granite-3B-Code-Instruct,其余各项指标均达到最优;通用语言能力与通用大模型MiniCPM-2B-sft-bf16还有一定差距,后续版本将对此进行强化,以此带来更自然、更流畅的对话,以及对用户需求更充分的理解,最终在自动化编程辅助、代码智能体领域有更加广阔的应用前景。
117
 
118
  ## 4.训练过程
119
-
120
  #### 预训练数据处理
121
-
122
  - 代码数据:
123
  - step1: 借助抽象语法树(AST)分析代码的结构,**去除存在低级语法错误与包含过时语法特性**(如print “Hello World”,Python3解释器已不再支持)的代码.
124
  - step2: 提取了**数据密集型代码**(例如base64格式编码或长字符串)和**简单重复代码**的特征并设计了正则表达式进行了针对性的过滤。
@@ -129,20 +116,16 @@
129
  <img width="100%" src="./picture/2-1.PNG">
130
  </p>
131
 
132
-
133
  - 通用语言数据:
134
  - step1: 在**StackExchange数据**中使用Llama3.1-70B-Chat对随机采样的2万个样本进行评分并使用评分结果训练了质量评估模型(准确率与召回率达95%),然后利用该模型对完整数据进行过滤。
135
  - step2: 从数据集中筛选出了Markdown与reStructureText格式的**技术文档**,这些格式的文件常为项目的说明文档或技术文档。然后,从中过滤出语言为中英文、包含Python代码块的文件。
136
 
137
  #### 预训练策略
138
-
139
  - 我们从MiniCPM-2B退火前的最后一个检查点开始继续预训练。学习率调度参照了WSD方法,即Warmup至一个较高的恒定学习率(称之为Stable阶段),用以搜索全局最优点,最后结合微调数据快速线性退火收敛至较低损失。其中,Stable阶段的恒定学习率设计主要为了便于随时接入新数据。在珠算大模型**数据确定的场景下,我们观测到在该阶段缓慢降低学习率更有利于预训练数据的充分学习**,因此应用了cosine学习率调度进行替换,形成WCL学习率调度(Warmup-Cosine-Linear)。学习率曲线如下图所示。
140
-
141
  <p align="center">
142
  <img width="50%" src="./picture/2-4.png">
143
  </p>
144
 
145
-
146
  - 预训练数据组成:
147
  - Cosine Decay阶段的预训练数据由70%的代码数据、10%数学相关数据、20%的通用语言数据组成,共95B token。
148
  - Linear Decay阶段预训练与微调数据比例为8:2,预训练内部组成与Cosine阶段保持一致,微调内部代码与通用语言数据的比例为1:1,共7B token。
@@ -152,9 +135,7 @@
152
  <img width="50%" src="./picture/2-7.png">
153
  </p>
154
 
155
-
156
  #### 面向代码的微调
157
-
158
  - 微调数据处理:我们提出了Semi-Instruct,结合了Natural-Instruct(自动收集)和Self-Instruct(模型合成)两种方式。首先,通过类似Self-Instruct的方法,修复Natural-Instruct代码的规范性问题并补充缺失的指令。同时,生成测试用例的输入,利用原始代码的正确性,执行原始代码获得输出。然后,利用完整的测试样例验证新代码的**正确性**。最终,为去除不同来源的数据之间的重复样本,我们借助基于句子嵌入的SemDeDup方法对数据整体进行了深层语义去重,确保了微调数据的**多样性**。
159
  - 微调策略:为充分激发模型预训练阶段习得的能力,微调阶段的数据配比与超参数设置训练尽可能地与预训练退火阶段保持了对齐,以减小两者之间的差距。具体而言,微调数据量约80万条,共训练3个epoch。**学习率(1.6e-4)、数据配比与退火阶段保持一致**。数据来源上,Code数据主要来自一些高质量的开源Code数据,NL数据我们则使用了Infinity-Instruct-7M数据中的Math、Commonsense和Subjective3个类别的数据。## 1.模型介绍
160
 
@@ -166,28 +147,20 @@
166
 
167
 
168
  ## 5.模型使用
169
-
170
  #### Quick Start
171
-
172
  [下载Ollama](https://github.com/ollama/ollama/blob/main/README.md)并启动Ollama service:
173
-
174
  ```bash
175
  ollama serve
176
  ```
177
-
178
  运行珠算大模型:
179
-
180
  ```bash
181
  ollama run HIT-SCIR/abacus
182
  ```
183
-
184
  #### Transformers 模型推理 + 流式生成
185
 
186
  <details>
187
 
188
-
189
  transformers支持为tokenizer添加聊天模板,并支持流式生成。示例代码如下:
190
-
191
  ```python
192
  # example/transformers-stream/stream.py
193
 
@@ -223,16 +196,12 @@ stream_output = model.generate(
223
  max_new_tokens=2048,
224
  )
225
  ```
226
-
227
  </details>
228
 
229
  #### ModelScope 模型推理
230
-
231
  <details>
232
-
233
-
234
  ModelScope的接口与Transformers非常相似,只需将transformers替换为modelscope即可:
235
-
236
  ```python
237
  # example/modelscope-generate/generate.py
238
 
@@ -266,10 +235,8 @@ print(tokenizer.decode(outputs[0], skip_special_tokens=False))
266
  #### vLLM 推理加速
267
 
268
  <details>
269
-
270
-
271
  珠算支持通过vLLM实现推理加速,示例代码如下:
272
-
273
  ```python
274
  # example/vllm-generate/generate.py
275
 
@@ -302,21 +269,16 @@ for output in outputs:
302
  #### llama.cpp部署
303
 
304
  <details>
305
-
306
-
307
  GGUF格式旨在快速加载和保存模型,由llama.cpp团队推出,适用于llama.cpp、Ollama等框架。您可以手动将HuggingFace格式的珠算转换到GGUF格式。下面介绍使用llama.cpp转GGUF的方法和部署步骤。
308
 
309
  ##### Step 1 环境准备
310
-
311
  首先需要下载llama.cpp的源码。
312
-
313
  ```bash
314
  git clone https://github.com/ggerganov/llama.cpp.git
315
  cd llama.cpp
316
  ```
317
-
318
  然后需要进行编译,推荐使用`cmake`。根据您的硬件平台,编译命令有细微差异:
319
-
320
  ```bash
321
  # cpu
322
  cmake -B build_cpu
@@ -328,70 +290,48 @@ cmake --build build_cuda --config Release -j 12
328
  ```
329
 
330
  ##### Step 2 格式转换(可选)
331
-
332
  以下命令需要在`llama.cpp/`目录下:
333
  转换为GGUF格式
334
-
335
  ```bash
336
  python convert.py --outfile /path/to/Abacus.gguf /path/to/Abacus
337
  ```
338
-
339
  进行GGUF格式的Q4_K_M量化,以下命令需要在`llama.cpp/build_cpu/bin`或者`llama.cpp/build_cuda/bin`目录下(依赖于编译的平台):
340
-
341
  ```bash
342
  ./llama-quantize /path/to/Abacus.gguf /path/to/Abacus-Q4_K_M.gguf Q4_K_M
343
  ```
344
-
345
  ##### Step 3 开始推理
346
-
347
  以下命令需要在`llama.cpp/build_cpu/bin`或者`llama.cpp/build_cuda/bin`目录下(依赖于编译的平台):
348
-
349
  ```bash
350
  ./llama-cli -m /path/to/Abacus.gguf -p "<用户>帮我写一个快速排序代码<AI>" -n 128
351
  ```
352
-
353
  关于`main`的更多参数,可以参考llama.cpp的[官方文档](https://github.com/ggerganov/llama.cpp/blob/master/examples/main/README.md)。
354
 
355
  </details>
356
 
357
  #### Ollama部署
358
-
359
  <details>
360
-
361
-
362
  GGUF格式模型同样可以使用Ollama部署。下面介绍简要步骤。
363
-
364
  ##### Step 1 环境准备
365
-
366
  这里使用仓库release的压缩包来免root安装,更多安装方法可以参考Ollama官方的[安装教程](https://github.com/ollama/ollama/blob/main/README.md)。
367
-
368
  ```bash
369
  wget https://github.com/ollama/ollama/releases/download/v0.3.10/ollama-linux-amd64.tgz
370
  tar -C /path/to/ollama -xzf /path/to/ollama-linux-amd64.tgz
371
  ```
372
-
373
  ##### Step 2 导入模型
374
-
375
  ```bash
376
  cd /path/to/ollama/bin
377
  ```
378
-
379
  构建`Modelfile`,指定导入GGUF模型路径,其内容示例如下,更多参数设置可参考[官方文档](https://github.com/ggerganov/llama.cpp/blob/master/examples/main/README.md)。
380
-
381
  ```bash
382
  FROM /path/to/Abacus.gguf
383
  ```
384
-
385
  Ollama创建模型
386
-
387
  ```bash
388
  ./ollama create Abacus -f path/to/Modelfile
389
  ```
390
-
391
  ##### Step 3 使用模型
392
-
393
  同样在`path/to/ollama/bin`路径下:
394
-
395
  ```bash
396
  ./ollama run Abacus
397
  >>> <用户>帮我写一个快速排序代码<AI>
@@ -400,9 +340,7 @@ Ollama创建模型
400
  </details>
401
 
402
  ## 6.微调适配平台
403
-
404
  #### 模型微调功能
405
-
406
  <p align="center">
407
  <img width="100%" src="./picture/4-1-2.png">
408
  </p>
@@ -410,40 +348,29 @@ Ollama创建模型
410
  <img width="100%" src="./picture/4-2-2.png">
411
  </p>
412
 
413
-
414
  #### 模型评估功能
415
-
416
  <p align="center">
417
  <img width="100%" src="./picture/4-3-2.png">
418
  </p>
419
 
420
-
421
  #### 模型推理功能
422
-
423
  <p align="center">
424
  <img width="100%" src="./picture/4-4-2.png">
425
  </p>
426
-
427
  微调适配平台将于测试完毕后发布。
428
 
429
  ## 7.VSCode插件
430
-
431
  基于珠算大模型的编程能力,我们面向VSCode平台构建了编程辅助插件。插件可以一键式安装,支持代码生成、代码补全、代码摘要等功能,根据用户已经输入的内容预测后续的代码或注释,有效提高开发效率。
432
-
433
  <p align="center">
434
  <img width="100%" src="./picture/4-5.gif">
435
  </p>
436
-
437
  由于珠算大模型具有良好的中文理解能力,用户可以直接用中文写注释来表达需求。
438
-
439
  <p align="center">
440
  <img width="100%" src="./picture/4-6.gif">
441
  </p>
442
-
443
  插件将于测试完毕后在VSCode应用市场发布。
444
 
445
  ## 8.开源协议
446
-
447
  对本仓库源码的使用遵循开源许可协议 [Apache 2.0](LICENSE)。
448
 
449
  珠算支持商用。如果将珠算模型或其衍生品用作商业用途,请您按照如下方式联系许可方,以进行登记并向许可方申请书面授权:联系邮箱:<[email protected]>。
 
16
  <a href="https://mp.weixin.qq.com/s/T24_U-aR1WuwQh9iDjCWCg" target="_blank" style="margin: 2px;">
17
  <img alt="Wechat" src="https://img.shields.io/badge/Abacus-Wechat-%23368B13?logo=wechat&logoColor=%23368B13" style="display: inline-block; vertical-align: middle;"/>
18
  </a>
19
+
20
+ <a href="https://github.com/HIT-SCIR/Abacus" target="_blank" style="margin: 2px;">
21
+ <img alt="Github" src="https://img.shields.io/badge/Abacus-GitHub-black?logo=github&logoColor=white" style="display: inline-block; vertical-align: middle;"/>
22
+ </a>
23
  <a href="LICENSE" style="margin: 2px;">
24
  <img alt="Code License" src="https://img.shields.io/badge/License-Apache_2.0-green.svg" style="display: inline-block; vertical-align: middle;"/>
25
  </a>
26
  </div>
27
 
28
 
 
29
  ---
30
 
31
  - [引言](#1引言)
 
37
  - [VSCode插件](#7VSCode插件)
38
 
39
  ## 1.引言
40
+ ​从DeepMind发布的AlphaCode在竞赛级编程能力上超越人类平均水平之日起,代码大模型便广受关注。与此同时,OpenAI发布的CodeX更是展示出了代码大模型具有超越传统编程范畴的数值推理、逻辑推断、工具调用等高阶能力,进一步引爆了对该领域的研究与讨论。以BigCode StarCoder为代表的开源项目对完善该领域的研究生态做出了卓越的贡献。然而,目前开源代码大模型提升编程能力的同时会严重损害通用语言能力。为此,哈尔滨工业大学社会计算与信息检索研究中心(HIT-SCIR)推出了<strong>“珠算”代码大模型</strong>,其以2.7B参数在**代码与通用语言平均性能上**均超越了DeepSeek-Coder-1.3B、Yi-Coder-1.5B、Stable Code-3B、Granite-3B-Code等参数量3B及以下的代码大模型,希望通过**开放权重、训练细节以及配套的微调适配平台与插件**,助力开源社区的发展。
 
 
41
  <p align="center">
42
  <img width="60%" src="picture/3-1.png">
43
  </p>
44
 
 
45
  - 珠算大模型在国内外3B量级代码大模型中具有最优的代码和通用语言能力。
46
  - 基于珠算大模型的编程辅助工具可以在VSCode内一键安装,支持代码生成与补全等应用。
47
 
 
50
 
51
  <div align="center">
52
 
53
+ |模型名称|文件大小|下载地址|备注|
54
+ |:---:|:---:|:---:|:---:|
55
+ |Abacus|5GB|[🤗HuggingFace](https://huggingface.co/HIT-SCIR/Abacus)<br>[ModelScope](https://www.modelscope.cn/models/HIT-SCIR/Abacus)|Abacus完整模型|
56
+ |Abacus-gguf|1.7GB(Q4_K_M)<br>2.7GB(Q8_0)|[🤗HuggingFace](https://huggingface.co/HIT-SCIR/Abacus-gguf)<br>[ModelScope](https://www.modelscope.cn/models/HIT-SCIR/Abacus-gguf)|珠算GGUF版本,适用于llama.cpp、Ollama等推理框架|
 
57
 
58
  </div>
59
 
60
 
61
 
62
  ## 3.模型评价
 
63
  #### 代码生成能力
 
64
  模型代码生成能力的评估主要基于以下评测基准:
 
65
  - HumanEval:由 164 道原创编程题组成的评测基准,通过衡量从文档字符串生成程序的功能正确性,评估语言理解、算法和简单的数学能力。
66
  - HumanEval+:HumanEval+将原始HumanEval中164道问题的单元测试的规模增加了80倍,用于严格评估 LLM 生成代码的功能正确性。
67
  - MBPP(sanitized):Python编程任务评测基准,经过人工验证后的MBPP子集,删减修改了原始MBPP中描述模糊、错误、不符合正常习惯的问题。
68
  - MBPP+:精简了原始MBPP中的问题数量,并将单元测试的规模增加35倍,用于严格评估 LLM 生成代码的功能正确性。
69
  - LiveCodeBench:旨在为 LLM 提供全面、公平的竞赛编程评估。 通过持续收集LeetCode、AtCoder和CodeForces竞赛平台的新问题,形成了动态的综合基准库。 为了确保数据不受污染,我们选择了 2024 年 1 月至 9 月的问题进行测试。
 
70
  <div align="center">
71
 
72
+ | 模型名称 | HumanEval | HumanEval+ | MBPP(sanitized) | MBPP+ | LiveCodeBench | AVG |
73
+ |:----------------------------------:|:-----------:|:------------:|:-----------------:|:-------:|:----------------:|:-------|
74
+ | Granite-3B-Code-Instruct | 45.73 | 39.63 | 53.70 | 41.10 | 7.46 | 37.52 |
75
+ | Stable-Code-Instruct-3B | 67.07 | 56.71 | 57.20 | 37.59 | **11.43** | 46.00 |
76
+ | Yi-Coder-1.5B-Chat | 67.68 | 60.37 | **61.87** | **48.37** | 8.22 | 49.30 |
77
+ | DeepSeek-Coder-1.3B-Instruct | 65.24 | 59.15 | 56.03 | 45.36 | 7.00 | 46.56 |
78
+ | 珠算 | **71.95** | **65.85** | 57.98 | 43.36 | 9.06 | **49.64** |
 
 
79
  </div>
80
 
81
  **在国内外3B以下代码大模型中,珠算大模型在五个主流代码评测基准上的综合表现达到最佳**,各项指标均处于领先水平。其中,在Humaneval和Humaneval+基准上的表现尤为突出;在MBPP(sanitized)和MBPP+基准上的表现略逊于最新发布的Yi-Coder-1.5B-chat;而在LiveCodeBench基准上的表现仅次于Stable-Code-Instruct-3B。
82
 
83
  #### 3.2 通用语言能力
 
84
  通用语言能力的评估主要基于以下评测基准:
 
85
  - MMLU:包含57个多选任务的英文评测基准,涵盖初等数学、美国历史、计算机科学、法律等,难度覆盖高中水平到专家水平,是目前主流的LLM评测基准之一。
86
  - HellaSwag:极具挑战的英文NLI评测基准,需要对上下文进行深入理解,无法基于常识直接回答。
87
  - ARC-e:多项选择题的问答评测基准,包含了从三年级到九年级的科学考试题目。ARC-e(easy) 是其中的一个简单难度测试子集。
 
89
  - C-Eval:全面的中文LLM评估基准,包含了13,948个多项选择题,涵盖了52个不同的学科和四个难度级别。
90
  - CMMLU:综合性中文评估基准,用于评估语言模型在中文语境下的知识和推理能力,涵盖了从基础学科到高级专业水平的67个主题。
91
  - GSM8K:高质量小学数学应用题评测基准,需要2到8个步骤来解决,解决方案主要涉及基本算术运算,可用于评价多步数学推理能力。
 
92
  <div align="center">
93
+
94
 
95
+ | 模型名称 | MMLU | HellaSwag | ARC-e | BBH | C-Eval | CMMLU | GSM8K | AVG |
96
+ |:-------------------------------:|:-------:|:-----------:|:---------:|:--------:|:---------:|:--------:|:--------:|:--------:|
97
+ | Granite-3B-Code-Instruct | 29.95 | 26.82 | 47.62 | 35.87 | 32.30 | 30.77 | **56.48** | 37.12 |
98
+ | Stable-Code-Instruct-3B | 29.34 | 32.15 | 34.74 | 21.69 | 28.61 | 29.18 | 15.92 | 27.37 |
99
+ | Yi-Coder-1.5B-Chat | 33.98 | 28.52 | 40.04 | 34.40 | 31.88 | 31.88 | 10.16 | 30.12 |
100
+ | DeepSeek-Coder-1.3B-Instruct | 26.68 | 25.25 | 27.69 | 7.48 | 25.61 | 26.88 | 9.63 | 21.32 |
101
+ | 珠算 | **40.18** | **53.23** | **66.67** | **36.08** | **36.00** | **36.84** | 46.32 | **45.05** |
 
 
102
 
103
  </div>
104
 
105
  **在国内外3B以下代码大模型中,珠算大模型在七个主流通用语言评测基准上的综合表现达到最佳**,且具有明显优势。除在数学推理GSM8K基准上低于Granite-3B-Code-Instruct,其余各项指标均达到最优;通用语言能力与通用大模型MiniCPM-2B-sft-bf16还有一定差距,后续版本将对此进行强化,以此带来更自然、更流畅的对话,以及对用户需求更充分的理解,最终在自动化编程辅助、代码智能体领域有更加广阔的应用前景。
106
 
107
  ## 4.训练过程
 
108
  #### 预训练数据处理
 
109
  - 代码数据:
110
  - step1: 借助抽象语法树(AST)分析代码的结构,**去除存在低级语法错误与包含过时语法特性**(如print “Hello World”,Python3解释器已不再支持)的代码.
111
  - step2: 提取了**数据密集型代码**(例如base64格式编码或长字符串)和**简单重复代码**的特征并设计了正则表达式进行了针对性的过滤。
 
116
  <img width="100%" src="./picture/2-1.PNG">
117
  </p>
118
 
 
119
  - 通用语言数据:
120
  - step1: 在**StackExchange数据**中使用Llama3.1-70B-Chat对随机采样的2万个样本进行评分并使用评分结果训练了质量评估模型(准确率与召回率达95%),然后利用该模型对完整数据进行过滤。
121
  - step2: 从数据集中筛选出了Markdown与reStructureText格式的**技术文档**,这些格式的文件常为项目的说明文档或技术文档。然后,从中过滤出语言为中英文、包含Python代码块的文件。
122
 
123
  #### 预训练策略
 
124
  - 我们从MiniCPM-2B退火前的最后一个检查点开始继续预训练。学习率调度参照了WSD方法,即Warmup至一个较高的恒定学习率(称之为Stable阶段),用以搜索全局最优点,最后结合微调数据快速线性退火收敛至较低损失。其中,Stable阶段的恒定学习率设计主要为了便于随时接入新数据。在珠算大模型**数据确定的场景下,我们观测到在该阶段缓慢降低学习率更有利于预训练数据的充分学习**,因此应用了cosine学习率调度进行替换,形成WCL学习率调度(Warmup-Cosine-Linear)。学习率曲线如下图所示。
 
125
  <p align="center">
126
  <img width="50%" src="./picture/2-4.png">
127
  </p>
128
 
 
129
  - 预训练数据组成:
130
  - Cosine Decay阶段的预训练数据由70%的代码数据、10%数学相关数据、20%的通用语言数据组成,共95B token。
131
  - Linear Decay阶段预训练与微调数据比例为8:2,预训练内部组成与Cosine阶段保持一致,微调内部代码与通用语言数据的比例为1:1,共7B token。
 
135
  <img width="50%" src="./picture/2-7.png">
136
  </p>
137
 
 
138
  #### 面向代码的微调
 
139
  - 微调数据处理:我们提出了Semi-Instruct,结合了Natural-Instruct(自动收集)和Self-Instruct(模型合成)两种方式。首先,通过类似Self-Instruct的方法,修复Natural-Instruct代码的规范性问题并补充缺失的指令。同时,生成测试用例的输入,利用原始代码的正确性,执行原始代码获得输出。然后,利用完整的测试样例验证新代码的**正确性**。最终,为去除不同来源的数据之间的重复样本,我们借助基于句子嵌入的SemDeDup方法对数据整体进行了深层语义去重,确保了微调数据的**多样性**。
140
  - 微调策略:为充分激发模型预训练阶段习得的能力,微调阶段的数据配比与超参数设置训练尽可能地与预训练退火阶段保持了对齐,以减小两者之间的差距。具体而言,微调数据量约80万条,共训练3个epoch。**学习率(1.6e-4)、数据配比与退火阶段保持一致**。数据来源上,Code数据主要来自一些高质量的开源Code数据,NL数据我们则使用了Infinity-Instruct-7M数据中的Math、Commonsense和Subjective3个类别的数据。## 1.模型介绍
141
 
 
147
 
148
 
149
  ## 5.模型使用
 
150
  #### Quick Start
 
151
  [下载Ollama](https://github.com/ollama/ollama/blob/main/README.md)并启动Ollama service:
 
152
  ```bash
153
  ollama serve
154
  ```
 
155
  运行珠算大模型:
 
156
  ```bash
157
  ollama run HIT-SCIR/abacus
158
  ```
 
159
  #### Transformers 模型推理 + 流式生成
160
 
161
  <details>
162
 
 
163
  transformers支持为tokenizer添加聊天模板,并支持流式生成。示例代码如下:
 
164
  ```python
165
  # example/transformers-stream/stream.py
166
 
 
196
  max_new_tokens=2048,
197
  )
198
  ```
 
199
  </details>
200
 
201
  #### ModelScope 模型推理
 
202
  <details>
203
+
 
204
  ModelScope的接口与Transformers非常相似,只需将transformers替换为modelscope即可:
 
205
  ```python
206
  # example/modelscope-generate/generate.py
207
 
 
235
  #### vLLM 推理加速
236
 
237
  <details>
238
+
 
239
  珠算支持通过vLLM实现推理加速,示例代码如下:
 
240
  ```python
241
  # example/vllm-generate/generate.py
242
 
 
269
  #### llama.cpp部署
270
 
271
  <details>
272
+
 
273
  GGUF格式旨在快速加载和保存模型,由llama.cpp团队推出,适用于llama.cpp、Ollama等框架。您可以手动将HuggingFace格式的珠算转换到GGUF格式。下面介绍使用llama.cpp转GGUF的方法和部署步骤。
274
 
275
  ##### Step 1 环境准备
 
276
  首先需要下载llama.cpp的源码。
 
277
  ```bash
278
  git clone https://github.com/ggerganov/llama.cpp.git
279
  cd llama.cpp
280
  ```
 
281
  然后需要进行编译,推荐使用`cmake`。根据您的硬件平台,编译命令有细微差异:
 
282
  ```bash
283
  # cpu
284
  cmake -B build_cpu
 
290
  ```
291
 
292
  ##### Step 2 格式转换(可选)
 
293
  以下命令需要在`llama.cpp/`目录下:
294
  转换为GGUF格式
 
295
  ```bash
296
  python convert.py --outfile /path/to/Abacus.gguf /path/to/Abacus
297
  ```
 
298
  进行GGUF格式的Q4_K_M量化,以下命令需要在`llama.cpp/build_cpu/bin`或者`llama.cpp/build_cuda/bin`目录下(依赖于编译的平台):
 
299
  ```bash
300
  ./llama-quantize /path/to/Abacus.gguf /path/to/Abacus-Q4_K_M.gguf Q4_K_M
301
  ```
 
302
  ##### Step 3 开始推理
 
303
  以下命令需要在`llama.cpp/build_cpu/bin`或者`llama.cpp/build_cuda/bin`目录下(依赖于编译的平台):
 
304
  ```bash
305
  ./llama-cli -m /path/to/Abacus.gguf -p "<用户>帮我写一个快速排序代码<AI>" -n 128
306
  ```
 
307
  关于`main`的更多参数,可以参考llama.cpp的[官方文档](https://github.com/ggerganov/llama.cpp/blob/master/examples/main/README.md)。
308
 
309
  </details>
310
 
311
  #### Ollama部署
 
312
  <details>
313
+
 
314
  GGUF格式模型同样可以使用Ollama部署。下面介绍简要步骤。
 
315
  ##### Step 1 环境准备
 
316
  这里使用仓库release的压缩包来免root安装,更多安装方法可以参考Ollama官方的[安装教程](https://github.com/ollama/ollama/blob/main/README.md)。
 
317
  ```bash
318
  wget https://github.com/ollama/ollama/releases/download/v0.3.10/ollama-linux-amd64.tgz
319
  tar -C /path/to/ollama -xzf /path/to/ollama-linux-amd64.tgz
320
  ```
 
321
  ##### Step 2 导入模型
 
322
  ```bash
323
  cd /path/to/ollama/bin
324
  ```
 
325
  构建`Modelfile`,指定导入GGUF模型路径,其内容示例如下,更多参数设置可参考[官方文档](https://github.com/ggerganov/llama.cpp/blob/master/examples/main/README.md)。
 
326
  ```bash
327
  FROM /path/to/Abacus.gguf
328
  ```
 
329
  Ollama创建模型
 
330
  ```bash
331
  ./ollama create Abacus -f path/to/Modelfile
332
  ```
 
333
  ##### Step 3 使用模型
 
334
  同样在`path/to/ollama/bin`路径下:
 
335
  ```bash
336
  ./ollama run Abacus
337
  >>> <用户>帮我写一个快速排序代码<AI>
 
340
  </details>
341
 
342
  ## 6.微调适配平台
 
343
  #### 模型微调功能
 
344
  <p align="center">
345
  <img width="100%" src="./picture/4-1-2.png">
346
  </p>
 
348
  <img width="100%" src="./picture/4-2-2.png">
349
  </p>
350
 
 
351
  #### 模型评估功能
 
352
  <p align="center">
353
  <img width="100%" src="./picture/4-3-2.png">
354
  </p>
355
 
 
356
  #### 模型推理功能
 
357
  <p align="center">
358
  <img width="100%" src="./picture/4-4-2.png">
359
  </p>
 
360
  微调适配平台将于测试完毕后发布。
361
 
362
  ## 7.VSCode插件
 
363
  基于珠算大模型的编程能力,我们面向VSCode平台构建了编程辅助插件。插件可以一键式安装,支持代码生成、代码补全、代码摘要等功能,根据用户已经输入的内容预测后续的代码或注释,有效提高开发效率。
 
364
  <p align="center">
365
  <img width="100%" src="./picture/4-5.gif">
366
  </p>
 
367
  由于珠算大模型具有良好的中文理解能力,用户可以直接用中文写注释来表达需求。
 
368
  <p align="center">
369
  <img width="100%" src="./picture/4-6.gif">
370
  </p>
 
371
  插件将于测试完毕后在VSCode应用市场发布。
372
 
373
  ## 8.开源协议
 
374
  对本仓库源码的使用遵循开源许可协议 [Apache 2.0](LICENSE)。
375
 
376
  珠算支持商用。如果将珠算模型或其衍生品用作商业用途,请您按照如下方式联系许可方,以进行登记并向许可方申请书面授权:联系邮箱:<[email protected]>。