เราคงเคยได้ยินว่า จำเป็นต้องใช้ GPU ในการเทรน Deep Learning ที่ Deep Learning ทำงานได้ดีในยุคปัจจุบัน ก็เพราะมี Data มหาศาลจากอินเตอร์เน็ต และ มี Hardware คือ GPU ทำให้การวิจัยอัลกอริทึมใหม่ ๆ สร้างโมเดล Deep Neural Network แบบใหม่ ๆ เทคโนโลยีพัฒนาได้อย่างรวดเร็ว
แต่มันเป็นเรื่องจริงหรือไม่ GPU มีผลแค่ไหน เทียบกับเราใช้ CPU ธรรมดา เราจะมาทดสอบกัน
CPU
CPU นั้นออกแบบมาให้ทำงานทีละงาน (Serial) ให้เร็วที่สุด ไม่ว่าจะซับซ้อนเท่าไร (ลึก) มีชุดคำสั่งพิเศษโดยเฉพาะ, รองรับแสง สี เสียง เน็ตเวิร์ค Security อุปกรณ์ต่อพ่วง, มีการ Optimize เอางานมาต่อ ๆ กันเป็น Pipeline, มีคาดเดาคำสั่งต่อไป เพื่อประหยัดเวลา, etc. ดังนั้น CPU 1 หน่วย จะใหญ่มาก แต่หลัง ๆ เริ่มมีการเพิ่มจำนวน Core เพื่อรองรับการประมวลผลแบบขนาน ดังเช่น Intel CPU Coffee Lake รูปด้านล่างมี 6 Core เรียกว่า Hexa-Core

GPU
แต่ GPU มีแนวคิดในการออกแบบที่ต่างออกไปโดยสิ้นเชิงคือ ทำงานง่าย ๆ หลาย ๆ งานขนานกัน (Parallel) ให้ได้พร้อมกันจำนวนมากที่สุด (กว้าง) Optimize โดยมี Core จำนวนมาก เช่น NVIDIA Turing TU102 ดังรูปด้านล่าง ไม่มีอะไรเลย มีแต่สี่เหลี่ยมสีเขียว คือ Streaming Multiprocessors (SM) 72 ตัว ในแต่ละตัวบรรจุ 64 CUDA Core ไว้ภายใน รวมเป็น 4,608 Core
NVIDIA Turing TU102 Full GPU with 72 SM Units Diagram. Credit: https://devblogs.nvidia.com/nvidia-turing-architecture-in-depth/ NVIDIA Turing TU102 GPU Core. Credit: https://devblogs.nvidia.com/nvidia-turing-architecture-in-depth/
เพราะเหตุนี้ GPU จึงเหมาะกับการประมวลผล Graphic บนหน้าจอความละเอียดสูงหลายล้าน Pixel ในปัจจุบัน เพราะแต่ละ Pixel ต้องการการประมวลผลเหมือน ๆ กันในทุก ๆ จุด
และเหมาะกับใช้เทรน Deep Learning ที่มีหลายล้าน Neuron ด้วย เพราะแต่ละ Neuron ก็ต้องการการประมวลผลเหมือน ๆ กัน โดยเฉพาะ Deep Neural Network แบบ Convolutional Neural Network (CNN)
เรามาเริ่มกันเลย
ใน Notebook นี้เราจะมาลองเปรียบเทียบ การเทรน Deep Neural Networks ด้วย CPU และ GPU ดูว่าใช้เวลาต่างกันอย่างไร
0. Magic Commands¶
%reload_ext autoreload
%autoreload 2
%matplotlib inline
1. Import Library¶
import fastai
from fastai import *
from fastai.vision import *
from fastai.metrics import accuracy
2. ข้อมูล¶
ใช้ชุดข้อมูล Dataset พันธุ์หมาแมว Oxford-IIIT Pet Dataset by O. M. Parkhi et al., 2012
path = untar_data(URLs.PETS)
path_images = path/'images'
filenames = get_image_files(path_images)
3. เตรียมข้อมูล¶
เพื่อความสะดวก เราจะประกาศฟังก์ชัน แล้วไปเรียกสร้างก่อน fit ด้วย CPU และ GPU
batchsize = 32
epoch = 6
np.random.seed(55)
regex_pattern = r'/([^/]+)_\d+.jpg$'
def get_databunch():
return ImageDataBunch.from_name_re(path_images,
filenames,
regex_pattern,
ds_tfms=get_transforms(),
size=224, bs=batchsize).normalize(imagenet_stats)
4. สร้างโมเดล¶
เพื่อความสะดวก เราจะประกาศฟังก์ชัน แล้วไปเรียกสร้างก่อน fit ด้วย CPU และ GPU
- เคสนี้เราจะใช้โมเดล models.resnet34
- pretrained=False หมายถึง เราจะเริ่มเทรนตั้งแต่ต้น ไม่เอา Weight ที่เคยเทรนกับ ImageNet มาแล้วมาใช้
def get_learner(databunch):
return cnn_learner(databunch, models.resnet34,
pretrained=True,
metrics=accuracy, callback_fns=ShowGraph)
5. เริ่มต้นเทรนโมเดล¶
เราจะเริ่มเทรนด้วย CPU เปรียบเทียบกับ GPU แล้วจับเวลาที่ใช้ในการเทรน
5.1 ลองเทรนด้วย CPU¶
fastai.torch_core.defaults.device = 'cpu'
learner = get_learner(get_databunch())
learner.fit_one_cycle(epoch)
ใช้เวลาไปเกือบ 1 ชั่วโมง
5.2 ลองเทรนด้วย GPU¶
fastai.torch_core.defaults.device = 'cuda'
learner = get_learner(get_databunch())
learner.fit_one_cycle(epoch)
ใช้เวลาไม่ถึง 5 นาที
6. สรุป¶
เปรียบเทียบ เวลาในการเทรน 6 Epoch ด้วย CPU และ GPU ในตารางดังนี้
Device | Time | Accuracy | Valid_Loss |
---|---|---|---|
CPU | 51:22 | 93.6% | 0.21 |
GPU | 3:36 | 93.5% | 0.19 |
สังเกตว่า ผลลัพท์ใกล้เคียงกัน แต่ใช้เวลาต่างกันถึงเกือบ 20 เท่า
หมายเหตุ¶
- อันนี้เป็นการทดสอบแบบคร่าว ๆ ให้พอเห็นภาพ มีตัวแปรอีกหลายอย่าง เช่น จำนวน Epoch, โมเดล, รุ่น GPU, CPU, ชนิดของ Disk, Batch Size, Memory, etc.
CPU ที่ใช้ คือ
Machine type: n1-highmem-8 (8 vCPUs, 52 GB memory) CPU: platformIntel Skylake
GPU ที่ใช้ คือ
Machine type: n1-highmem-8 (8 vCPUs, 52 GB memory) CPU: platformIntel Skylake GPUs: 1 x NVIDIA Tesla P4
Credit¶