iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0

一般訓練模型上,都會建議採用 transfer learning ,可以參考 Day 1 的內容實務,可以節省更多的時間和運算資料。但是如果自己重頭訓練模型的時候,就會需要用到極巨大的 dataset。例如說,GPT-2 的 WebText dataset 超過 40 GB,檔案超過 800萬個。這種這麼巨大的資料集,要載入到電腦裡,那麼記憶體會吃不消的。

在 Hugging Face 裡透過 Arrow 和 Stream 兩種機制,讓我們可以有效率的來操作資料,節省記憶體。

載入超巨大的 dataset: The Pile

The Pile 是一個高達 800 GB 的 dataset,由 22 個不同的 subsets 所組成的,表格摘錄自論文如下圖。有興趣的朋友可以去看這篇論文

koko hugging face in azure machine learning-- dataset the pile

  1. 我們可以去 The Pile 提供的網址下載 dataset。
    https://mystic.the-eye.eu/public/AI/pile_preliminary_components/

  2. 選好你要的 dataset 之後,打開你 Azure Machine Learning 的 Notebook,可以用下面的程式碼載入,我們找一個小一點的、 JSON 格式的dataset,才不會花太久的時間。我們這裡載入 NIH 的 dataset。

from datasets import load_dataset
url = "https://mystic.the-eye.eu/public/AI/pile_preliminary_components/NIH_ExPORTER_awarded_grant_text.jsonl.zst"
nih_dataset = load_dataset("csv", data_files=url, split= "train")

nih_dataset
  1. 接著去泡杯咖啡或飲料,我們可以看到這裡要跑很久,如下圖。如果你沒有裝過 zstandard 這個套件的話可能會報錯,可以用 pip install zstandard 來安裝。

koko hugging face in azure machine learning-- dataset the pile

  1. 載完 dataset 之後,我們可以來看一下資料長什麼樣,如下面兩張圖。

koko hugging face in azure machine learning-- dataset the pile

koko hugging face in azure machine learning-- dataset the pile
5. 接著我們安裝 psutil,這是可以看記憶體目前消耗量的套件。!pip install psutil

  1. 使用下面的程式碼來看目前用掉了多少的資源。
import psutil

print(f"RAM used: {psutil.Process().memory_info().rss / (1024 * 1024):.2f} MB")

print(f"Number of files in dataset : {nih_dataset.dataset_size}")

size_gb = nih_dataset.dataset_size / (1024**3)
print(f"Dataset size (cache file) : {size_gb:.2f} GB")

  1. 這裡我們可以看到資料集雖然 1.91 GB 這麼大,但是 RAM 的使用卻沒有這麼大,只有688.48 MB。如下圖。這就是 Hugging Face Dataset 厲害的地方了。它應用了 Apache Arrow 來把資料轉換成 Columnar format 的形式,因此可以用更少的記憶體。詳細的原理可以參考這裡
    koko hugging face in azure machine learning-- dataset the pile

  2. Hugging Face 官方給了這段程式碼,可以讓你測看看這讀資料的效能多好。

import timeit

code_snippet = """batch_size = 1000

for idx in range(0, len(nih_dataset), batch_size):
    _ = nih_dataset[idx:idx + batch_size]
"""

time = timeit.timeit(stmt=code_snippet, number=1, globals=globals())
print(
    f"Iterated over {len(nih_dataset)} examples (about {size_gb:.1f} GB) in "
    f"{time:.1f}s, i.e. {size_gb/time:.3f} GB/s"
)
  1. 結果如下圖,4.8秒就 iterate 完 1.9 GB 的資料了,真的太神了!!

koko hugging face in azure machine learning-- dataset the pile

明天我們就來看 Stream dataset 的部分。


上一篇
# Day7-載入自己的 Dataset
下一篇
# Day9-載入極巨大的 Dataset -- Stream 篇
系列文
變形金剛與抱臉怪---NLP 應用開發之實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言