以微调 BERT 进行文本分类为例介绍Google Colab基本使用方式

微调模型的基本流程(以 Transformers 为例)

  1. 准备环境

    • 使用 GPU
    • 安装需要的库(如 transformersdatasetsaccelerate
  2. 加载预训练模型

    • bert-base-uncased, gpt2, llama, chatglm
  3. 准备数据集

    • 本地上传 / 从 Hugging Face 加载 / 自己合成
  4. 设置 Trainer / FineTuning 参数

    • 学习率、epoch、batch size 等
  5. 开始训练(Colab GPU 上)

    • 可以保存权重到 Google Drive
  6. 保存 / 推理 / 导出模型

0. 基本使用

打开colab

url: https://colab.research.google.com/

在导航栏点击file

image-20250701011002698

选择 New notebook in Drive ,后续会保存在你的google drive里

image-20250701012740138

或者在进入网页之后的弹窗里选择 + New notebook

image-20250701011050081

之后会自动创建一个 .ipynb 格式的文件

image-20250701011220403

之后可以在红色框住的地方输入python代码,然后点击左边的黑色开始按钮执行。

例如第一步想要安装一些微调模型必须的python库可以输入

!pip install transformers datasets accelerate

然后点击执行会有如下的反应:

image-20250701011323862

image-20250701011338649

在执行完成之后,原来的开始键旁边会有一个绿色的小勾,提示说运行完成,之后可以在下面查看运行的日志

image-20250701011531432

如果想要隐藏这个日志,可以点击开始键下面的按钮,然后选择第一个 Show/hide output

image-20250701011651038

之后就会将日志进行隐藏,如果想要查看日志,可以再次选择这个选项 Show hidden output

image-20250701011751607


之后想要运行新的python代码可以点击上方的 + Code

image-20250701011955907

点击之后在原来代码框的下方就会出现一个新的代码框

image-20250701012011915

也可以点击 + Text 然后添加一个文本框(markdown格式)作为注释或者对代码的说明

image-20250701012136463

编辑完文字之后点击别处就可以保存,如果想再次编辑只需要双击这个文本框即可

image-20250701012259024

除了在导航栏外,也可以直接将鼠标移动到代码块或者文本块下,会出现两个选项,选择想要的一项即可。

image-20250701012434625

主要代码:

1. 安装库

!pip install transformers>=4.3 datasets accelerate
!pip install --upgrade datasets fsspec

2. 加载预训练模型和 tokenizer

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

3. 加载数据集

from datasets import load_dataset

dataset = load_dataset("imdb")
tokenized = dataset.map(lambda x: tokenizer(x["text"], truncation=True, padding="max_length"), batched=True)
load_dataset("imdb") 中,"imdb" 是 Hugging Face Datasets 库 中的一个 内置数据集名称,表示 IMDB 电影评论数据集,是一个经典的二分类情感分析任务数据集。

4. 使用 Trainer 微调

from transformers import Trainer, TrainingArguments

args = TrainingArguments(
    output_dir="./results",
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    num_train_epochs=2,
    save_steps=500,
    logging_dir='./logs',
    report_to="none",
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized["train"].shuffle().select(range(2000)),  # 小规模训练
    eval_dataset=tokenized["test"].shuffle().select(range(500)),
)

trainer.train()

使用 GPU(Colab 设置)

点击菜单栏「Runtime(运行时) → Change runtime type(更改运行时类型)」,选择 GPU 或 TPU」,训练速度可以大大提高。

数据 & 模型保存

你可以将训练过程中的模型、日志保存在 Google Drive 上:

from google.colab import drive
drive.mount('/content/drive')

# 保存模型
model.save_pretrained("/content/drive/MyDrive/bert_finetuned")
tokenizer.save_pretrained("/content/drive/MyDrive/bert_finetuned")

今天就是搬到学长的出租屋里了。
刚好今天学长也出差,接下来的一周我应该就是一个人在这里。
这几天朋友还在实验室,应该是下午在,这是我去实验室的动力。
等她回家之后,我大概就会在出租屋躺尸,好好整理整理,沉淀沉淀自己。
又是一年暑假,今年感觉自己的心态会平和很多,对很多事情都没有什么看法。我不知道这是不是开始麻木的征兆。其实我还是希望可以多去体验一些东西,但是仔细去看其实还是被一层浅浅的焦虑包裹着。
我也不知道以后会如何,先过好现在吧。
好好活着。

昨天的时候和一个朋友出去玩。是意外的。其实我是高兴的。
晚上天渐渐黑了,海河岸边的一排整齐排列的灯把水面的粼粼染成金属一般的橙色。
我和她就这样沿着这条河慢慢走着。
微风吹来,不似下午那么的热,晚上的风也变得温和,轻轻刮过面颊觉得很舒服。
广场零次的有着跳广场舞的,卖咖啡的,还有垂钓的,也有和我们一样从外面过来只是想来走走的。
不知道晚上的天津是什么味道的,我默默跟在她旁边。有时候她走的比较快,我就跟上,有时候我走的比较快,就向后去找她。有的时候不小心挨到了,鼻尖缭绕着淡淡的香味,不可名状。
我是没有什么感慨的,只是想跟着走在她旁边。
四周不知道为什么随着我们的脚步越来越静,走到头了。周围还是黄色的,灯光打在建筑上,人为的制造出了一种朦胧感。
我们停下,我看了看她,问她接下来去哪。
后来我们回去了。直到现在我才堪堪有种遗憾。
我不是很敢去想让这段意外能一直保持着,或许也是因为逐渐知道这是不可能的。
昨天的下午还有晚上,就像是我枯燥生活意外的被溅到了一滴水,还在的时候没有感觉到什么,当意识到的时候,已经蒸发了。
我幻想过这次会面,很是期待,我又害怕这种期待会让这一会面变得无味。
后来才发现原来是我期待的不够多,就这样让它流过去了。
生活回到从前那样,没有变化。但我好像回不去了。

今天帮忙部署一下实验室接的一个项目的后端
出了几个比较大的问题,好在最后还是成功的完成了工作

第一个就是公司的服务器不能连外部的局域网,所以这就导致了不能使用git从仓库来拉取项目,只能是手动的上传。
他们那边的运维工具是堡垒机,说实话我还是第一次见,觉得很新奇。
和那种直接将服务器ip和账号密码给你的模式不同,他们是有一个统一的终端来保存这些服务器的信息,当选择特定的要运维的服务器的时候可以选择本地或者跳板机的ssh应用连接到服务器。
一开始因为本地的xshell没有配xfrp,然后不能上传文件,在这里卡了很久。
事实上一开始我都不知道服务器不能连外网。
因为不能连外网,所以不能用git来拉取,还有就是不能使用go mod tidy。
说实话这两步恶心了我很久。
对于前一个其实一开始就想过todesk把文件传过去,然后用xfrp传过去。
但是那边用windows应用连接不能访问本地的文件,后面想这个windows应用连接应该就是用堡垒机,或者说跳板机连接。
之后换本地连接,但是本地的xshell没有配xfrp,一开始想的是用rz -E,但是没有安装lrzsz
而且因为是内网所以安装不了。
后来就是我自己尝试安装xfrp,但是发现要使用的话安装7和5都让用(注xshell版本是5),一直提示要更新,更新到8之后确实可以用,但是在xshell界面跳转到xfrp界面时会发现报错,并且连接就掉了(指xfrp)xshell还健在。
其实在安装xfrp的过程中还把机器差点搞崩溃了
幸亏后面冒死重启没事
最后无奈还是求助了那边的运维,后面下午的时候他们装了一个版本为4的xshell和xfrp终于可以用了

下午的时候将go的项目文件上传
上传之后发现了一个大问题就是因为得装依赖,用go mod tidy
这个过程需要联网,所以行不通
后面想到要不就在本地编译一下再上传
但是后来发现由于之前项目负责人留下的技术债,导致在编译的时候有一个文件路径的变量是使用的当前编译环境的路径并且写死。
后面发现修改起来很困难,一度想放弃。
之后没办法在5点多的时候和那边的运维反映,然后他们说要连外网得申请,
找谁申请?谁负责找谁。 ……
后来去找了另外一个公司那边的人,这次干脆说服务器不允许连外网,让我自己想办法解决。

后面想过直接将本地gopath下面的依赖打包,然后传到服务器的gopath,但是还是会强制的使用go download
之后了解了一下知道了有 go mod vendor这一条指令,可以将项目用到的依赖打包
之后只要将vendor文件夹放到服务器项目的根目录下就可以了
不过后面还是出问题了
因为go mod和go sum和我开发的环境对不上,所以少了一些对应版本的依赖
后来发现是因为一开始我为了将项目拖进去,使用的是gitee上下载的zip包,不是本地在开发的
所以可能会有些出路。
后来我想过将go.mod和go.sum直接替换,但是失败了,也尝试过将部分依赖的版本号,手动修改到和开发环境一致,但是也失败了。

最后没办法就在下的master的zip包里运行了一次go mod vendor,然后将这里面的vendor包传到服务器。
最后是成功运行了,但是有报错,后面问了一下学长,主要是sonic包导入有问题。
这个sonic包是字节跳动的一个包,说是有魔法,正常用download下,下不干净,必须要用go get。
其实到这里的时候我的耐心快要没了。
不过最后突然灵光一现,将本地开发环境和vendor文件夹一块打包成zip
传到服务器,然后解压
最后成了。
我觉得成的原因主要就是这最后一次是整体传上去而不是分开的。

后面的任务就简单了,调试一下,配一下日志。我的工作结束了。
之后前端unity的部署,还有数据库方面的检查就是另外两位学长的工作了。
一下子就轻松了。

这次的部署任务还是很开心的,总体来说。因为对于我来说,这也是第一次给企业部署项目,多少也有点激动。也学到了挺多经验的。而且我已经很久没有做过运维性质的活了,真的感觉挺不错。当然这个不错是建立在我成功,并且不用返工的前提下,hhh。