เราคงเคยได้ยินว่า จำเป็นต้องใช้ 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

Intel CPU Coffee Lake Microarchitectures Hexa-core die annotated. Credit: https://en.wikichip.org/wiki/intel/microarchitectures/coffee_lake
Intel CPU Coffee Lake Microarchitectures Hexa-core die annotated. Credit: https://en.wikichip.org/wiki/intel/microarchitectures/coffee_lake

GPU

แต่ GPU มีแนวคิดในการออกแบบที่ต่างออกไปโดยสิ้นเชิงคือ ทำงานง่าย ๆ หลาย ๆ งานขนานกัน (Parallel) ให้ได้พร้อมกันจำนวนมากที่สุด (กว้าง) Optimize โดยมี Core จำนวนมาก เช่น NVIDIA Turing TU102 ดังรูปด้านล่าง ไม่มีอะไรเลย มีแต่สี่เหลี่ยมสีเขียว คือ Streaming Multiprocessors (SM) 72 ตัว ในแต่ละตัวบรรจุ 64 CUDA Core ไว้ภายใน รวมเป็น 4,608 Core

เพราะเหตุนี้ GPU จึงเหมาะกับการประมวลผล Graphic บนหน้าจอความละเอียดสูงหลายล้าน Pixel ในปัจจุบัน เพราะแต่ละ Pixel ต้องการการประมวลผลเหมือน ๆ กันในทุก ๆ จุด

และเหมาะกับใช้เทรน Deep Learning ที่มีหลายล้าน Neuron ด้วย เพราะแต่ละ Neuron ก็ต้องการการประมวลผลเหมือน ๆ กัน โดยเฉพาะ Deep Neural Network แบบ Convolutional Neural Network (CNN)

เรามาเริ่มกันเลย

Open In Colab

ใน Notebook นี้เราจะมาลองเปรียบเทียบ การเทรน Deep Neural Networks ด้วย CPU และ GPU ดูว่าใช้เวลาต่างกันอย่างไร

0. Magic Commands

In [0]:
%reload_ext autoreload
%autoreload 2
%matplotlib inline

1. Import Library

In [0]:
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

In [0]:
path = untar_data(URLs.PETS)
path_images = path/'images'
filenames = get_image_files(path_images)

3. เตรียมข้อมูล

เพื่อความสะดวก เราจะประกาศฟังก์ชัน แล้วไปเรียกสร้างก่อน fit ด้วย CPU และ GPU

In [0]:
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 มาแล้วมาใช้
In [0]:
def get_learner(databunch):
    return cnn_learner(databunch, models.resnet34, 
                      pretrained=True, 
                      metrics=accuracy, callback_fns=ShowGraph)

5. เริ่มต้นเทรนโมเดล

เราจะเริ่มเทรนด้วย CPU เปรียบเทียบกับ GPU แล้วจับเวลาที่ใช้ในการเทรน

5.1 ลองเทรนด้วย CPU

In [0]:
fastai.torch_core.defaults.device = 'cpu'
learner = get_learner(get_databunch())
learner.fit_one_cycle(epoch)
epochtrain_lossvalid_lossaccuracytime
01.1182670.3791260.88633308:35
10.5253150.2887720.91272008:33
20.3865140.2862580.91272008:33
30.3250700.2431300.93098808:33
40.2654080.2182350.93301808:33
50.2036740.2109110.93640108:35

ใช้เวลาไปเกือบ 1 ชั่วโมง

5.2 ลองเทรนด้วย GPU

In [0]:
fastai.torch_core.defaults.device = 'cuda'
learner = get_learner(get_databunch())
learner.fit_one_cycle(epoch)
epochtrain_lossvalid_lossaccuracytime
01.1151450.3518910.89309900:36
10.5323630.2852190.90324800:35
20.4008360.2516820.91610300:36
30.3190960.2110880.93301800:36
40.2451200.1964900.93504700:36
50.2304510.1952430.93504700:36

ใช้เวลาไม่ถึง 5 นาที

6. สรุป

เปรียบเทียบ เวลาในการเทรน 6 Epoch ด้วย CPU และ GPU ในตารางดังนี้

DeviceTimeAccuracyValid_Loss
CPU51:2293.6%0.21
GPU3:3693.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

In [0]:
 

แชร์ให้เพื่อน:

Keng Surapong on FacebookKeng Surapong on GithubKeng Surapong on Linkedin
Keng Surapong
Project Manager at Bua Labs
The ultimate test of your knowledge is your capacity to convey it to another.

Published by Keng Surapong

The ultimate test of your knowledge is your capacity to convey it to another.