สร้างโมเดล Machine Learning ด้วย GPU บน AWS

การสร้างโมเดล machine learning ที่มีความแม่นยำสักโมเดลนั้น คอมพิวเตอร์ต้องใช้ทรัพยากรในการประมวลผลสูงมาก ดังนั้นเพื่อให้สามารถประมวลผลได้เร็วขึ้น เราจึงมักใช้ GPU ในการเทรนโมเดล…
อ้าว! แล้วถ้าคอมเราไม่มี GPU หละจะทำอย่างไร? ไม่ต้องกังวลไป เพราะ AWS เป็นทางออกหนึ่งที่ช่วยให้เราสามารถรันโมเดลโดยใช้ GPU ได้ ผ่าน cloud ของ AWS
โดยที่ผมจะมาสอนในวันนี้มีอยู่ 2 วิธีครับคือการรันโมเดลผ่าน SageMaker และอีกวิธีคือ การสร้างเครื่อง EC2 โดยเลือกเป็นเครื่อง server ที่มี GPU ซึ่งเหมาะสำหรับการเทรนโมเดล machine learning ครับ
ก่อนอื่นเรามาทำความเข้าใจกับก่อนครับว่า SageMaker นั้นคืออะไร
1. SageMaker
เป็นบริการหนึ่งของ AWS ไว้ใช้สำหรับทำงานด้าน machine learning โดยเฉพาะ ซึ่งเราไม่จำเป็นต้องไปลงไลเบอร์รี่เอง เนื่องจากใน SageMkaer มี enviroment ให้เราเลือกว่าต้องการ enviroment ที่มีไลเบอร์รี่อะไรบ้าง เพื่อความสะดวก และรวดเร็วแก่ผู้พัฒนาในการสร้าง, เพิ่มประสิทธิภาพ และใช้งานโมเดล machine learning

สำหรับขั้นตอนพื้นฐานในการในการใช้งาน SakeMaker นั้น เราเริ่มโดยการสร้าง S3 ก่อนซึ่ง S3 นั้นคือที่สำหรับเก็บข้อมูลไฟล์ dataset ของเรา
- มาที่เว็บไซต์ของ AWS

2. ไปที่ปุ่ม Services และกดเลือกไปที่ S3

3. กด Create bucket เพื่อสร้างที่เก็บข้อมูลอันใหม่

4. ตั้งชื่อ Bucket และเลือก Region โดยในที่นี้ผมตั้งชื่อ Bucket ว่า my-first-time และเลือก Region ไปที่ Asia Pacific (Singapore) ap-southeast-1

5. ตรวจสอบข้อมูล และเลื่อนลงมาล่างสุด กดปุ่ม Create bucket

เมื่อสำเร็จแล้ว จะออกมาหน้าตาแบบนี้

ต่อมาเราจะ upload dataset ขึ้นไปใน S3 ซึ่ง dataset ในที่นี้ผมใช้ข้อมูลที่เป็นไฟล์ csv
6. กดไปที่ชื่อ S3 ที่เราได้สร้างเอาไว้ แล้วกดไปที่ Upload

7. กด Add file แล้วเลือกไฟล์ที่ต้องการ upload

8. เมื่อเลือกเสร็จแล้ว เลื่อนลงมาล่างสุด และกดไปที่ Upload

เมื่อ upload เสร็จแล้ว จะออกมาในลักษณะนี้

เมื่อเราเตรียมการทางด้านของ S3 เสร็จแล้ว ก็ถึงเวลาที่เราจะมาจัดการ SageMaker ของเรากันแล้วครับ ถ้าพร้อมแล้วลุยกันเลย! 😆
9. กดที่ Services อีกครั้ง แล้วเลือกไปที Amazon SageMaker

10. กดไปที่ Notebook instances

11. กด Create notebook instance

12. ตั้งชื่อ notebook และกำหนดชนิดของเครื่อง โดยในที่นี้ผบตั้งชื่อว่า first-time และเลือกเครื่องแบบ ml.t2.medium

13. เลื่อนลงไปด้านล่าง ตรงที่ IAM role แล้วกดไปที่ Create a new role

14. เลือกว่าต้องการให้ notebook นี้เข้าถึง S3 อันไหนได้บาง โดยในที่นี้ผลเลือกให้สามารถเช้าถึง S3 ได้ทุกอัน (เพื่อนๆสามารถเลือกกำหนดชื่อเฉพาะ S3 บางตัวก็ได้ครับ) เมื่อเลือกเสร็ขแล้วกด Create role

15. เลื่อนลงมาล่างสุด แล้วกด Create notebook instance

16. รอสักพักจนที่ Status ขึ้นว่า InService หลังจากนั้นเราเปิดใช้งานบน jupyter notebook กัน (หรือว่าเพื่อนบางคนอาจใช้ Open JupyterLab ก็ได้ครับ ขึ้นอยู่กับความถนัดของแต่ละคน)

17. กด New แล้วเลือก enviroment ที่ต้องการ โดยในที่นี้ผมเลือก conda_amazonei_tensorflow2_p36 ครับ

18. โดยเราสามารถเขียนโค๊ด แล้วสั่งรันเหมือนใน jupyter notebook ตามปกติเลยครับ

ต่อไปผมจะอธิบายโค๊ดคร่าวๆที่ใช้ในตัวอย่างครั้งนี้ครับ ซึ่งรวมไปถึงคำสั่งจำเป็นที่เราต้องเอาไว้ใช้เพื่อให้สามารถเข้าถึงข้อมูลใน S3 ได้ครับ
ในเซลล์แรกนั้นไลเบอร์รี่ที่สำคัญสำหรับการเข้าถึงข้อมูลใน S3 คือ boto3
import pandas as pd
import boto3
import pickle
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB
import numpy as np
ในที่นี้ผมต้องการเข้าถึง S3 ที่ชื่อว่า my-first-time ซึ่งเป็น S3 ที่เราได้สร้างเอาไว้ก่อนหน้านี้
bucket = 'my-first-time'
subfolder = ''
conn = boto3.client('s3')contents = conn.list_objects(Bucket=bucket, Prefix=subfolder)['Contents']
for f in contents:
print(f['Key'])
และเมื่อเรามาลอง print
ชื่อไฟล์ใน S3 นี้เราได้ผลลัพท์ออกมาไปไฟล์ที่ผมได้ upload เอาไว้ก่อนหน้านี้ ตามภาพด้านล่าง

กำหนดชื่อไฟล์ที่จะใช้ในตัวแปลหนึ่ง และใช้ pandas อ่านข้อมูลออกมา
test_file = 'iris_test.csv'
train_file = 'iris_training.csv'data_train = 's3://{}/{}'.format(bucket, train_file)
data_test = 's3://{}/{}'.format(bucket, test_file)df_train = pd.read_csv(data_train)
df_test = pd.read_csv(data_test)
เมื่อเรามาลองดูตารางที่ออกมา จะพบว่าข้อมูลในตารางกับชื่อคอลลัมน์นั้นไม่สัมพันธ์กัน ตามภาพด้านล่าง

ที่จริงแล้วชื่อคอลัมน์ควรเป็นความยาวของกลีบเลี้ยง, ความกว้างของกลีบเลี้ยง, ความยาวกลีบดอก, ความกว้างกลีบดอก และสายพันธุ์ของดอกตามลำดับ 😅
แต่ไม่เป็นไรครับ เพราะอันนี้เป็นตัวอย่างสาธิตการใช้งานเฉยๆ 555 ในการใช้งานจริงเพื่อนๆสามารถเปลี่ยน dataset ตรงส่วนนี้เป็นอย่างอื่นได้ครับ
ต่อมาทำการแบ่งข้อมูลออกเป็น 2 ส่วนคือ train set และ test set พร้อมแปลงข้อมูลจาก dataframe เป็น numpy array
x_train_df = df_train[['120', '4', 'setosa', 'versicolor']]
y_train_df = df_train['virginica']x_test_df = df_test[['30', '4', 'setosa', 'versicolor']]
y_test_df = df_test['virginica']x_train = x_train_df.to_numpy()
y_train = y_train_df.to_numpy()x_test = x_test_df.to_numpy()
y_test = y_test_df.to_numpy()
หลังจากนั้นสร้างโมเดลขึ้นมา โดยในที่นี้ผมใช้ naive bays ของ sklearn ครับ
clf = BernoulliNB()
clf.fit(x_train, y_train,sample_weight=2)
สุดท้ายก็บันทึกโมเดลไว้ใน jupyter notebook ครับ
filename = 'model.sav'
pickle.dump(clf, open(filename, 'wb'))
ต่อมาเป็นอีกวิธีหนึ่งคือการสร้าง เครื่อง EC2 ที่มี GPU ซึ่งจะเป็นการเรียนใข้งาน เครื่อง server ทั้งเครื่อง ไม่ใช่เพียงแค่ notebook ครับ เรามาต่อกันเลยครับ
- กดที่ Services แล้วเลือกที่ EC2

2. เลือกที่ Instances แล้วกดไปที่ Launch instances

3. เลือก Image ที่ต้องการ โดยในที่นี้ผมเลือก Deep Learning AMI (Ubuntu 18.04) Version 41.0 เมื่อเลือกเสร็ขแล้ว กด Select

4. เลือกชนิดของเครื่องที่ต้อกการ แล้วกด Next

5. มาหน้านี้กด Next ได้เลยครับ

6. กดหนด Size ของพื้นที่เก็บที่ต้องการ (สำหรับเครื่องนี้ต้องกำหนดขั้นต่ำที่ 100 GB) แล้วกด Review and Lunch

7. กด Launch

8. สร้าง key pair สำหรับ ssh เข้าไปใช้งานเครื่อง instance ได้ โดยช่องด้านบนเลือก Create a new key pair และตั้งชื่อ key pair โดยในที่นี้ผมตั้งชื่อว่า first-key-pair เมื่อเสร็จแล้วกด Download Key Pair หลังจากนั้นเราจะได้ key ซึ่งเป็นไฟล์ .pem ออกมา

9. เมื่อเรามี key pair แล้ว เราก็กด Launch Instances ด้านล่างสุด
ถ้าสร้างสำเร็จ จะปรากฏออกมาตามภาพด้านล่าง

และเมื่อเรากลับไปที่หน้า Instance เราจะพบว่ามีเครื่องของเรากำลังรันอยู่

กดที่เครื่องที่เราต้องการใช้งาน แล้วกด Connect จะเข้าสู้หน้าตามภาพด้านล่าง เราสามารถก็อปคำสั่งตามภาพด้านล่างลงไปใน terminal ของเราเพื่อเชื่อมต่อกับเครื่อง instace นั้นได้

ด้านล่างเป็นภาพตัวอย่างเมื่อเรา ssh เข้ายังเครื่อง EC2 ได้ครับ

หลังจากนั้นเราก็สามารถอัปโหลดงานขึ้นไปบนเครื่อง EC2 แล้วใช้คำสั่ง command line ของ Unix ได้ตามปกติเลยครับ 😃
ซึ่งวิธีนี้ก็เป็นอีกทางเลือกหนึ่งสำหรับผู้ที่ต้องการเทรนโมเดล machine learning ด้วย GPU แต่เครื่องคอมเราไม่มี GPU แรงๆไว้รันครับ ถ้าว่างๆก็ลองไปเล่นกันได้นะครับ 😆