0 準備部分
0.1?創建虛擬數據
import numpy as npfrom datasets import Datasetseq_len, dataset_size = 512, 512
dummy_data = {"input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),"labels": np.random.randint(0, 1, (dataset_size)),
}
dummy_data
'''
使用 np.random.randint 函數生成一個形狀為 (dataset_size, seq_len),即 512x512 的數組。
數組中的每個元素是一個隨機整數,范圍從 100 到 30000。使用 np.random.randint 函數生成一個形狀為 (dataset_size,) 的數組,其中的元素是 0 或 1
表示每個樣本的標簽
'''
'''
{'input_ids': array([[11687, 1246, 6661, ..., 20173, 3772, 29152],[ 720, 25945, 11963, ..., 11675, 27842, 3553],[22100, 26587, 19452, ..., 1836, 24395, 22849],...,[11610, 24425, 1026, ..., 6237, 28503, 2775],[10266, 22622, 14079, ..., 24491, 26029, 17796],[11500, 7688, 13780, ..., 4839, 13967, 18493]]),'labels': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0])}
'''
ds = Dataset.from_dict(dummy_data)
ds.set_format("pt")
#將它們存儲在一個帶有PyTorch格式的數據集中
ds
'''
Dataset({features: ['input_ids', 'labels'],num_rows: 512
})
'''
0.2 輔助函數
為了打印GPU利用率和使用Trainer進行訓練運行的摘要統計信息,定義了兩個輔助函數
0.2.1 打印GPU內存使用情況
from pynvml import *def print_gpu_utilization(device_id=1):nvmlInit()#初始化 NVML 庫handle = nvmlDeviceGetHandleByIndex(device_id)#獲取索引為 device_id 的 GPU 設備的句柄。info = nvmlDeviceGetMemoryInfo(handle)'''使用前面獲取的句柄,查詢該 GPU 的內存信息。返回的對象包含了 GPU 內存的總量、已使用的量和空閑的量。'''print(f"GPU內存占用:{info.used // 1024 ** 2} MB。")'''打印 GPU 當前已使用的內存量,單位為 MB。這里通過將字節單位的值除以 1024 的平方來轉換為 MB
print_gpu_utilization()
#GPU內存占用:270 MB。
0.2.2 打印訓練過程的信息
def print_summary(result):print(f"時間:{result.metrics['train_runtime']:.2f}")'''打印訓練過程的運行時間從 result 對象中的 metrics 字典獲取 'train_runtime' 鍵的值格式化為兩位小數。'''print(f"樣本/秒:{result.metrics['train_samples_per_second']:.2f}")'''打印訓練速度,即每秒處理的樣本數從 result 對象中的 metrics 字典獲取 'train_samples_per_second' 鍵的值格式化為兩位小數。'''print_gpu_utilization()#調用 print_gpu_utilization() 函數來打印 GPU 的內存使用情況
1 加載模型,查看GPU空間占用情況
print_gpu_utilization(1)
#print_gpu_utilization(1)from transformers import AutoModelForSequenceClassificationmodel = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-large-uncased").to("cuda:1")
print_gpu_utilization(1)
#GPU內存占用:1866 MB。
2? 訓練模型時的GPU占用情況
default_args = {"output_dir": "tmp","eval_strategy": "steps","num_train_epochs": 1,"log_level": "error","report_to": "none",
}
'''
output_dir: 指定輸出目錄,這里設置為 "tmp"。
eval_strategy: 設置評估策略為 "steps",意味著在訓練過程中會按照步驟進行模型評估。
num_train_epochs: 設置訓練周期為 1,即整個訓練集只會被訓練一遍。
log_level: 設置日志級別為 "error",這樣只有錯誤信息會被記錄。
report_to: 設置報告輸出目標為 "none",這表示不將訓練進度報告輸出到任何外部服務或控制臺。
'''
from transformers import TrainingArguments, Trainer, logginglogging.set_verbosity_error()
#讓 transformers 庫只輸出錯誤級別的日志。training_args = TrainingArguments(per_device_train_batch_size=1,**default_args)
'''
TrainingArguments: 創建一個訓練參數對象,設置每個設備的訓練批量大小為 1
并將前面定義的默認參數集成進來。
'''
trainer = Trainer(model=model, args=training_args, train_dataset=ds)
#Trainer: 初始化訓練器,傳入模型、訓練參數和訓練數據集。
result = trainer.train()
#使用 trainer.train() 啟動訓練過程,并將結果存儲在 result 變量中
print_summary(result)
在我這邊的GPU上跑不起來:可能是不同版本的cuda、pytorch導致的(不確定)