CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MidSpore框架实现,在鹏城实验室“鹏城云脑II”中的192个节点(共1536个国产昇腾910 AI处理器)上训练而成。截至2022年6月22日,CodeGeeX历时两个月在20多种编程语言的代码语料库(>8500亿Toke)上预训练得到。CodeGeeX有以下特点: 在HumaEval-X代码生成任务上,与其它开源基线模型相比,CodeGeeX取得了最佳的平均性能。 支持的laguage:'C++', 'C', 'C#', 'Cuda', 'Objective-C', 'Objective-C++', 'Pytho', 'Java', 'Scala', 'TeX', 'HTML', 'PHP', 'JavaScript', 'TypeScript', 'Go', 'Shell', 'Rust', 'CSS', 'SQL', 'Kotli', 'Pascal', 'R', 'Fortra', 'Lea' 基于CodeGeeX,我们开发了一款免费的VS Code插件,在应用市场搜索“codegeex”或通过该链接安装。详细的使用指南在CodeGeeX插件使用指南. 左侧:CodeGeeX训练数据中各编程语言占比。
右侧:CodeGeeX训练损失函数随训练步数下降曲线。 我们在Midspore 1.7框架上实现了CodeGeeX模型,并使用鹏城实验室的全国产计算平台上进行训练。具体来说,CodeGeeX使用了其一个计算集群中的1536个昇腾910 AI处理器(32GB)进行了两个月左右的训练(2022年4月18日至6月22日)。除了Layer-orm与Softmax使用FP32格式以获得更高的精度与稳定性,模型参数整体使用FP16格式,最终整个模型需要占用约27GB显存。为了增加训练效率,我们使用8路模型并行和192路数据并行的训练策略,微批大小为16、全局批大小为3072,并采用ZeRO-2优化器降低显存占用。 在开发与训练过程中,我们和华为Midspore团队合作,对MidSpore框架进行了部分优化,进而大幅度提升训练效率。比如,我们发现矩阵乘法的计算时间占比仅为22.9%,大量时间被用于各类其它算子,因此实现了一系列算子融合,包括单元素算子融合、层归一化算子融合、FastGelu与矩阵乘法融合、批量矩阵乘法与加法融合等;再比如我们还对矩阵乘法算子的维度实现自动搜索调优,使其搜索出效率最高的计算维度组合。这些优化为训练速度带来了显著提升,在同等GPU卡数规模下(128卡),昇腾910对CodeGeeX这一模型的训练效率从约为NVIDIA A100的16.7%提升至43%;在千卡规模下,昇腾910训练效率相比自身优化前提升近300%。使用优化后的软硬件训练时,CodeGeeX单日训练量可达到54.3B个标识符(含填充符),证明了国产深度学习平台与工具的快速迭代能力以及强大竞争力。 为了更好地评测代码生成模型的多语言生成能力,我们构建了一个新基准HumaEval-X。此前,多语言代码生成能力是基于语义相似度(比如CodeBLEU)衡量的,具有一定误导性;HumaEval-X则可用于衡量生成代码的功能正确性。HumaEval-X包含820个高质量手写样本,覆盖Pytho、C++、Java、JavaScript、Go,可用于多种任务。 HumaEval-X支持的任务示例。 HumaEval-X中每个语言的样本,包含了声明、描述和解答,它们之间的组合可以支持不同的下游任务,包括生成、翻译、概括等。我们目前关注两个任务: 左侧: HumaEval-X中五种语言具体的pass@k(k=1,10,100)性能。右侧: 模型在所有语言上的平均性能。CodeGeeX的平均表现优于ICoder-6.7B和CodeGe-Multi-6B/16B。 我们将CodeGeeX与另外两个开源代码生成模型进行比较,分别为Meta的ICoder与Salesforce的CodeGe,选取ICoder-6.7B、CodeGe-Multi-6B 与 CodeGe-Multi-16B。CodeGeeX能获得最佳的平均性能,显著超越了参数量更小的模型(7.5%~16.3%的提升),与参数量更大的模型CodeGe-Multi-16B表现相当(平均性能 54.76% vs. 54.39%)。CodeGeeX: 多语言代码生成\翻译模型
代码范例
from modelscope.models import Model
from modelscope.pipelies import pipelie
from modelscope.utils.costat import Tasks
model = 'ZhipuAI/CodeGeeX-Code-Geeratio-13B'
pipe = pipelie(
task=Tasks.code_geeratio,
model=model,
)
iputs = {
'prompt': 'from typig import List\\def has_close_elemets(umbers: List[float], threshold: float) -> bool:\ \"\"\" Check if i give list of umbers, are ay two umbers closer to each other tha\ give threshold.\ >>> has_close_elemets([1.0, 2.0, 3.0], 0.5)\ False\ >>> has_close_elemets([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)\ True\ \"\"\"\ retur",',
'laguage': 'Pytho',
}
result = pipe(iputs)
prit(result)
VS Code插件使用指南
CodeGeeX: 多语言代码生成模型
[注释符] laguage: [语言],例如:# laguage: Pytho。我们使用与GPT-2相同的分词器,并将空格处理为特殊标识符,词表大小为50400。整个代码语料含有23种编程语言、总计1587亿个标识符(不含填充符)。国产平台实现与训练
HumaEval-X: 多语言代码生成基准
多语言代码生成
点击空白处退出提示










评论