【Python】科研代码学习:十四 wandb (可视化AI工具)
溢流眼泪 2024-07-30 09:01:10 阅读 67
【Python】科研代码学习:十四 wandb[可视化AI工具]
wandb 介绍注册账号使用 `HF Trainer` + `wandb` 训练低级 API
wandb 介绍
【wandb官网】
<code>wandb 是 Weights & Biases
的缩写(w and b)核心作用:
可视化重要参数云端存储提供各种工具可以和其他工具配合使用,比如下面的 pytorch, HF transformers, tensorflow, keras
等等
可以在里面使用 <code>matplotlib貌似是 tensorboard
的上位替代
注册账号
首先我们需要去官网注册账号,貌似不能使用vpn
注册号后,按照教程创建一个团队,然后来到这个界面
可以按照这个 Quickstart
的样例走一下。选择 Track Runs
,接下来可以选择使用哪个工具训练的模型
然后需要 pip install wandb
导包,以及 wandb login
登录
使用 <code>HF Trainer + wandb
训练
我们调用官方给的样例
我们发现其实新添了这几个内容:
WANDB_PROJECT
环境变量:项目名
WANDB_LOG_MODEL
环境变量:是否保存中继到wandb
WANDB_WATCH
环境变量在 TrainingArguments
中,设置了 report_to="wandb"code>
最后调用 wandb.finish()
,整体变化不大
# This script needs these libraries to be installed:
# numpy, transformers, datasets
import wandb
import os
import numpy as np
from datasets import load_dataset
from transformers import TrainingArguments, Trainer
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# 设置GPU编号
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2"
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)code>
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return { "accuracy": np.mean(predictions == labels)}
print("Loading Dataset")
# download prepare the data
dataset = load_dataset("yelp_review_full")
print("Loading Tokenizer")
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
small_train_dataset = dataset["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = dataset["test"].shuffle(seed=42).select(range(300))
small_train_dataset = small_train_dataset.map(tokenize_function, batched=True)
small_eval_dataset = small_train_dataset.map(tokenize_function, batched=True)
print("Loading Model")
# download the model
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased", num_labels=5)
# set the wandb project where this run will be logged
os.environ["WANDB_PROJECT"]="my-awesome-project"
# save your trained model checkpoint to wandb
os.environ["WANDB_LOG_MODEL"]="true"
# turn off watch to log faster
os.environ["WANDB_WATCH"]="false"
# pass "wandb" to the 'report_to' parameter to turn on wandb logging
training_args = TrainingArguments(
output_dir='models',code>
report_to="wandb",code>
logging_steps=5,
per_device_train_batch_size=32,
per_device_eval_batch_size=32,
evaluation_strategy="steps",code>
eval_steps=20,
max_steps = 100,
save_steps = 100
)
print("Loading Trainer")
# define the trainer and start training
trainer = Trainer(
model=model,
args=training_args,
train_dataset=small_train_dataset,
eval_dataset=small_eval_dataset,
compute_metrics=compute_metrics,
)
print("Training")
trainer.train()
# [optional] finish the wandb run, necessary in notebooks
wandb.finish()
在 wandb 网站中
我们可以打开该 project。每一次运行相当于一次 run
,我这里跑了三次所以就有三条线。
这里主要是看 eval
验证集和 train
训练集的一些参数。
我们可以删掉不关心的面板,或者增添一个想看的面板
但如果两个参数的值域变化比较大的话,在一个图里面比较难看清,所以比较相关的参数才建议放在一个图里。
低级 API
这上面是封装比较高级的 API,一般我们也都配合 <code>transformers 库去用
如果想用比较原生的 API,一般用法如下:
首先调用 wandb.init()
方法
然后使用 wandb.log(dict)
输出你要可视化的参数即可。
# train.py
import wandb
import random # for demo script
wandb.login()
epochs = 10
lr = 0.01
run = wandb.init(
# Set the project where this run will be logged
project="my-awesome-project",code>
# Track hyperparameters and run metadata
config={
"learning_rate": lr,
"epochs": epochs,
},
)
offset = random.random() / 5
print(f"lr: { lr}")
# simulating a training run
for epoch in range(2, epochs):
acc = 1 - 2**-epoch - random.random() / epoch - offset
loss = 2**-epoch + random.random() / epoch + offset
print(f"epoch={ epoch}, accuracy={ acc}, loss={ loss}")
wandb.log({ "accuracy": acc, "loss": loss})
# run.log_code()
上一篇: 李彦宏: 开源模型是智商税|马斯克: OpenAI 闭源不如叫 CloseAI
下一篇: AI日报:当前最强国产Sora大模型Vidu发布;Kimi Chat移动端升级;通义千问开源首个千亿参数模型;苹果计划与 OpenAI 合作
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。