代码补全快餐教程(4) - 训练语言模型

简介: 本节我们学习如何训练一个语言模型,并用于代码补全中

代码补全快餐教程(4) - 训练语言模型

一个强大的语言模型可以是其他任务的良好基础。预训练的模型就为我们提供了一个强大的语言模型基础,在些基础上,我们进行微调,就可以实现满足特殊需求的模型。
我们先做实操,然后再讲解相关理论。

代码数据准备

严格来讲,进行代码数据准备需要做代码的排重,后面讲到相关论文时我们会讲到。
现在我们就用个最简单的办法,将代码先拼接在一起。

我们写个小脚本,将transformer库中的python文件都读出来连接在一起:

import os


def walkPrograms(dir, datafile, wildcard):
    exts = wildcard.split(" ")
    for root, subdirs, files in os.walk(dir):
        for name in files:
            for ext in exts:
                if name.endswith(ext):
                    print(root)
                    # print(subdirs)
                    print(name)
                    filename = os.path.join(root, name)
                    print(filename)
                    try:
                        f1 = open(filename, 'r', encoding='utf-8')
                        datafile.writelines(f1.readlines())
                    except UnicodeDecodeError:
                        continue
                    break


outfile = open('transformer.data', 'w', encoding='utf-8')
wildcard = '.py'
walkPrograms('/home/xulun/github/transformers/', outfile, wildcard)

最后会生成一个transformer.data文件,其中是python文件的组合。

语言模型fine-tuning

进行训练之前,我们先安装下transformer库,先cd到transformers的下载目录,然后执行

pip3 install -e . --user

安装成功之后,我们就可以使用transformers下的examples中的run_lm_finetuning.py脚本来进行fine-tuning:

python3 run_lm_finetuning.py \
    --output_dir=/home/xulun/out_trans \
    --model_type=gpt2 \
    --model_name_or_path=gpt2 \
    --per_gpu_train_batch_size=1 \
    --do_train \
    --train_data_file=/home/xulun/github/lusinga/localcomplete/server/transformer.data \
    --block_size=512 --save_steps=500 --overwrite_output_dir

我们来介绍下这些参数的含义:

  • output_dir: 最终我们要保存的是权值,这里给出保存权值的目录
  • model_type: 模型的大类,比如gpt2或者其他
  • model_name_or_path: 模型的小类,比如gpt2-medium, gpt2-large, gpt2-xl等
  • per_gpu_train_batch_size: 多CPU训练时每个CPU批次的大小
  • do_train: 只有指定了这个才会进行训练
  • train_data_file: 要训练的文件名
  • block_size: 分块的大小,如果GPU内存大就多选点,我用的是NVidia 2060 GPU,内存较小,所以我选了个相对较小的值
  • save_steps: 训练多少步保存一次,默认值是50,我觉得有点小,这里改成500
  • overwrite_output_dir: 输出目录不为空时覆盖之,节省存储空间

验证效果

我们做个补全效果测试吧,还是我们之前的代码,我们先用gpt2试试效果:

import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel

# MODEL = '/home/xulun/out_trans/'
MODEL = 'gpt2'

# 加载词汇表
tokenizer = GPT2Tokenizer.from_pretrained(MODEL)

# 输入待补全的文本
text = '    indexed_tokens = tokenizer.'
predicted_text = text

# 加载模型中预训练好的权值
model = GPT2LMHeadModel.from_pretrained(MODEL)

# 设置为eval模式,这样就不会执行训练模式下的Dropout过程
model.eval()
#model.to('cuda')

# 每一个只能补一个token出来,补一句话需要多次,30次是我拍脑袋的
for i in range(0,30):

    # 以上次预测结果作为本次的输入,所谓的自回归
    indexed_tokens = tokenizer.encode(predicted_text)

    # 将读出的索引标记转化成PyTorch向量
    tokens_tensor = torch.tensor([indexed_tokens])

    # 使用GPU进行加速,诚实地讲速度不太快
    #tokens_tensor = tokens_tensor.to('cuda')

    # 进行推理
    with torch.no_grad():
        outputs = model(tokens_tensor)
        predictions = outputs[0]

    # 获取预测的下一个子词
    predicted_index = torch.argmax(predictions[0, -1, :]).item()
    # 解码成我们都读懂的文本
    predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])
    # 打印输入结果
    print(predicted_text)

输出如下:

indexed_tokens = tokenizer.get_tokenizer_id(tokenizer.get_tokenizer_id(), tokenizer.get_tokenizer_id(), tokenizer.

下面我们换成我们刚才训练的模型,就是让MODEL从gpt2换成刚才我们训练好的目录:

MODEL = '/home/xulun/out_trans/'

好吧,有同学要完整的:

import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel

MODEL = '/home/xulun/out_trans/'
# MODEL = 'gpt2'

# 加载词汇表
tokenizer = GPT2Tokenizer.from_pretrained(MODEL)

# 输入待补全的文本
#text = 'function walk(dir, fn) { if (fs.existsSync(dir)) { let stat ='
#text = 'if (stat.isDirectory()) {fs.readdirSync(dir).'
#text = 'mediaFileText.color ='
#text = 'mediaFileText.top ='
text = '    indexed_tokens = tokenizer.'
predicted_text = text

# 加载模型中预训练好的权值
model = GPT2LMHeadModel.from_pretrained(MODEL)

# 设置为eval模式,这样就不会执行训练模式下的Dropout过程
model.eval()
#model.to('cuda')

# 每一个只能补一个token出来,补一句话需要多次,30次是我拍脑袋的
for i in range(0,30):

    # 以上次预测结果作为本次的输入,所谓的自回归
    indexed_tokens = tokenizer.encode(predicted_text)

    # 将读出的索引标记转化成PyTorch向量
    tokens_tensor = torch.tensor([indexed_tokens])

    # 使用GPU进行加速,诚实地讲速度不太快
    #tokens_tensor = tokens_tensor.to('cuda')

    # 进行推理
    with torch.no_grad():
        outputs = model(tokens_tensor)
        predictions = outputs[0]

    # 获取预测的下一个子词
    predicted_index = torch.argmax(predictions[0, -1, :]).item()
    # 解码成我们都读懂的文本
    predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])
    # 打印输入结果
    print(predicted_text)

输出结果如下:

indexed_tokens = tokenizer.encode("Hello, my dog is cute", add_special_tokens=True)

看起来是比原始模型更懂transformers。我们可以用更多的代码进行训练,这样就能对于写python代码的效果更好。
如果要支持其他语言,我们将训练集换成其他语言就可以了。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
4月前
|
机器学习/深度学习 人工智能 算法
没想到!AlphaZero式树搜索也能用来增强大语言模型推理与训练
【7月更文挑战第26天】Xidong Feng等研究人员提出了一项创新方法,通过采用AlphaZero式的树搜索算法来增强大语言模型(LLMs)的推理与训练能力。这项技术,称为TS-LLM(Tree-Search for LLMs),将LLMs的解码过程视为搜索问题,并运用AlphaZero的树搜索来指导这一过程。TS-LLM不仅提升了模型的通用性和适应性,还在多个任务中实现了显著的性能提升。此外,它能在训练阶段指导LLMs学习更优的解码策略。尽管如此,TS-LLM依赖于高质量的预训练LLM,并面临较高的计算成本挑战。[论文](https://arxiv.org/abs/2309.17179)
77 5
|
1月前
|
机器学习/深度学习 自然语言处理
【绝技揭秘】模型微调与RAG神技合璧——看深度学习高手如何玩转数据,缔造预测传奇!
【10月更文挑战第5天】随着深度学习的发展,预训练模型因泛化能力和高效训练而备受关注。直接应用预训练模型常难达最佳效果,需进行微调以适应特定任务。本文介绍模型微调方法,并通过Hugging Face的Transformers库演示BERT微调过程。同时,文章探讨了检索增强生成(RAG)技术,该技术结合检索和生成模型,在开放域问答中表现出色。通过实际案例展示了RAG的工作原理及优势,提供了微调和RAG应用的深入理解。
49 0
|
3月前
|
机器学习/深度学习 数据采集 TensorFlow
从零到精通:TensorFlow与卷积神经网络(CNN)助你成为图像识别高手的终极指南——深入浅出教你搭建首个猫狗分类器,附带实战代码与训练技巧揭秘
【8月更文挑战第31天】本文通过杂文形式介绍了如何利用 TensorFlow 和卷积神经网络(CNN)构建图像识别系统,详细演示了从数据准备、模型构建到训练与评估的全过程。通过具体示例代码,展示了使用 Keras API 训练猫狗分类器的步骤,旨在帮助读者掌握图像识别的核心技术。此外,还探讨了图像识别在物体检测、语义分割等领域的广泛应用前景。
26 0
|
3月前
|
自然语言处理 物联网
《哇塞!LoRA 竟如魔法般实现大模型 LLM 微调,带你开启自然语言处理的奇幻冒险之旅!》
【8月更文挑战第21天】大语言模型革新了自然语言处理领域,但直接应用往往效果欠佳。LoRA(Low-Rank Adaptation)应运而生,通过低秩矩阵分解减少微调参数量,有效降低成本并避免过拟合。LoRA在每层加入可训练低秩矩阵,捕获特定任务信息而不大幅改动原模型。示例代码展示如何使用LoRA对预训练模型进行文本分类任务的微调,体现其高效灵活的特点。随着大模型的发展,LoRA将在NLP领域扮演关键角色。
53 0
|
4月前
|
机器学习/深度学习 存储 自然语言处理
使用Python实现深度学习模型:语言翻译与多语种处理
【7月更文挑战第21天】 使用Python实现深度学习模型:语言翻译与多语种处理
178 0
|
5月前
|
自然语言处理
斯坦福新研究:RAG能帮助LLM更靠谱吗?
【6月更文挑战第8天】斯坦福大学研究表明,检索增强生成(RAG)技术可提升大型语言模型(LLM)的准确性,但在不正确或矛盾的检索信息下,LLM可能产生误导性答案。研究发现,提供准确检索信息时,LLM准确率可达94%,但错误信息可能导致LLM重复错误。LLM对信息的依赖和内部知识的冲突是关键问题,提示技术的选择也会影响其行为。研究强调使用RAG需谨慎,并指出需要进一步探索LLM在复杂情况下的表现。
88 7
|
6月前
|
机器学习/深度学习 人工智能 搜索推荐
【边做边学】大语言模型(LLM)
【边做边学】大语言模型(LLM)
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
ChatGPT学python——制作自己的AI模型(一)初步了解
ChatGPT学python——制作自己的AI模型(一)初步了解
|
机器学习/深度学习 云安全 人工智能
文心千帆:PPT 制作、数字人主播等应用场景惊艳到我了,下面给ERNIE-Bot|BLOOMZ大模型调优、RLHF训练详细教程
文心千帆:PPT 制作、数字人主播等应用场景惊艳到我了,下面给ERNIE-Bot|BLOOMZ大模型调优、RLHF训练详细教程
文心千帆:PPT 制作、数字人主播等应用场景惊艳到我了,下面给ERNIE-Bot|BLOOMZ大模型调优、RLHF训练详细教程
|
机器学习/深度学习 自然语言处理 计算机视觉
大语言模型的视觉天赋:GPT也能通过上下文学习解决视觉任务
大语言模型的视觉天赋:GPT也能通过上下文学习解决视觉任务
118 0