PyTorch 01 : ทดสอบการจัดการ Tensor ด้วย torch ตัวแทน NumPy โดยใช้ Google Colab + free GPU และโลกความจริงอันโหดร้าย

Paripol Toopiroh
5 min readJun 3, 2018

--

เริ่มต้น Deep Learning กับ TensorFlow มาติ๊ดหนึ่ง มีเพื่อนๆชวนข้ามฟากให้มาลองดู Pytorch ดูบ้าง ไม่ขัดศรัทธา ขอทำไป Blog ไปเลยละกัน จะได้ Note ปัญหาที่เจอเผื่อเป็นประโยชน์กับผู้ที่เริ่มต้นเหมือนผมครับ

เริ่มแรกเข้าเว็บ https://pytorch.org/ ก็จะเจอข้อความน่าสนใจ

“Tensors and Dynamic neural networks in Python
with strong GPU acceleration.”

“PyTorch is a deep learning framework for fast, flexible experimentation.”

แค่ข้อความเชิญชวนก็ Epic แล้วจับความได้ว่า เร็ว และ เร็ว พอเห็นคำว่า GPU ผมเปิด Colab ขึ้นมารอไว้เลย เพราะเครื่อง mac การ์ดจอ Intel เดิมๆของผมได้แต่มองตาปริบๆ ขยายความคือเครื่อง mac การ์ดจอเป็น intel ตามความเข้าใจของผมไม่สามารถใช้ python มาเรียกใช้งาน GPU ด้วย CUDA ได้ ใครมี GPU กับ OS ที่ support เลือก install ตามในเว็บของ Pytorch ได้เลยครับ

Check Install Pytorch on MacOS

มาเริ่มกันเลย Tutorial แรกเอาที่ง่ายสุด What is PyTorch?
PyTorch มีจุดเด่นสำหรับเรียกแขก 2 ข้อคือ
1. ใช้ความสามารถของ GPU มาแทนการใช้งาน NumPy
2. ความยืดหยุ่น และ ประมวลผลได้เร็วเพื่อนำไปใช้ทำ Deep Learning

เปิด Colab กันแล้วก็มาเริ่มกันเลยครับ copy code ผมจาก Colab ผมที่นี่ครับ Pytorch01 ← กดได้นะ

คำว่า Tensors ในโลกของ Pytorch มีความคล้ายกับ ndarrays ของ NumPy เพิ่มความหล่อด้วยการเพิ่มความสามารถของการใช้การประมวลผลด้วย GPU เข้าไปด้วย หล่อจริมๆ

Import torch

งาน copy & parse & Run ก็มา ทันทีที่กด กด Shift + Enter โป๊ะ เพื่อ Run ป๊าบบบ
.
.
.
.
.
Error แดงเถือก Colab ไม่มี Pytorch ลืมมมมมมมมมมมปายยยเลยยย

Error ModuleNotFoundError: No module named ‘torch’

แต่ด้วยความน่ารักของทีมงาน Colab ให้ตัวช่วยปุ่ม INSTALL TORCH สีฟ้าสดใสมาให้เราก็กดสิครับ

Import torch to Colab

ที่ Code snippets ทีมงาน Colab ให้เราสามารถ Insert Code install PyTorch ให้เลยน่ารักครั้งที่ 2 ผมขอเก็บ Error ไว้ดูต่างหน้าใน Colab ผมด้วยละกันครับ
พอ Install เสร็จ เอา Code เดิมมา Run ใหม่คราวนี้จะรอดปลอดภัยแล้วครับเริ่มต้นกับ PyTorch กันต่อได้

Let’s torch

ตาม Tutorial ท่านสอนให้เราสร้าง Matrix 5x3 โดยยังไม่ต้อง Initial value ให้โอเคก็ทำตามไปดิจะไปยากอะไร

แต่โลกความจริงนั้นโหดร้ายอีกแล้ว Tutorial วาดภาพให้สวยงาม ใครว่า Copy & Parse ตาม Tutorial มันง่าย แต่ตอนนี้ Error อีกแล้ว object torch ไม่รู้จัก empty WTF……

ค้นหาอยู่สักพักได้ความว่าใน Tutorial ของ PyTorch เป็น version 0.4.0 แต่เราหล่ะเป็น version อะไร ไม่ทันสังเกตุตอน install ทีมงาน Colab จัด version 0.3.0.post4 CUDA 8.0 บน Linux มาให้ และ Python ที่ผมใช้อยู่เป็น 3.6.3 ม่ายยยเป็นไร หาวิธีลง 0.4.0 ก่อนไม่งั้นความหรรษาคงตามมาอีกเป็นระยะๆ

กลับไปดูที่เว็บ PyTorch ในส่วนของการ Install เพื่อหา script มา install PyTorch ตัวใหม่ ผมเลือกเป็น CUDA 9.0 บน Linux มาใช้ copy code ไป run ใน Colab ได้เลย
ปล. ใน file Colab ผมสั่ง pip3 install torchvision ไปด้วยแต่เรา install ไปแล้วตั้งแต่ครั้งแรกดังนั้นไม่จำเป็นที่จะต้องสั่ง install อีกครั้งก็ได้ครับแต่ถ้า Run อีกครั้งไม่เสียหายอะไร

!pip3 install http://download.pytorch.org/whl/cu90/torch-0.4.0-cp36-cp36m-linux_x86_64.whl

Install torch-0.4.0

แต่อย่าเพิ่งดีใจไปครับถึงแม้เรา Install torch 0.4.0 แล้วก็จริง สิ่งที่ต้องทำก่อนจะเขียน code กันต่อคือ Restart Runtime ของ Colab กันก่อนมิเช่นนั้นก็จะ Error เหมือนเดิม วิธี Restart Runtime คือไปที่เมนู Runtime->Restart runtime…

เช็ค Version และ Run Code เพื่อสร้าง Tensor empty 5x3 อีกทีคราวนี้จะผ่านแล้ว นำตาไหลออกมาเป็นสายเลือด อะไรที่มันครั้งแรกย่อมยากเสมอ

มาเริ่มทำความเข้าใจ torch กันต่อ จากตัวอย่าง torch สามารถสร้าง Matrix และ Tensor ได้ไม่ต่างจาก NumPy และใช้ทั้ง rand , zeros หรือ ใส่ค่าให้ tensor เข้าไปตรงๆ ก็ได้เช่นเดียวกัน

จะสร้าง tensor อ้างอิงจาก tensor เดิมเช่นสามารถใช้ .new_* ตามด้วย ones เพื่อสร้าง Matrix ที่มีค่า 1 ให้มีขนาด 5x3 จากนั้นใช้ torch.randn_like() เพื่อสร้าง matrix ที่ random value ให้มีขนาดเท่ากับ x ตัวเดิม

จะดูขนาด Matrix ใช้ size()

มาดูตัวอย่างการใช้งาน Operation กันบ้าง ยกตัวอย่างการบวกก็สามารถทำได้หลายวิธี

แบบที่ 1 : บวกแบบ x + y บ้านๆ

แบบที่ 2 : torch.add(x , y)

แบบที่ 3 : เอาตัวแปรมารับจาก torch.add( x , y , result )

แบบที่ 4 : In-place บวกค่า x ไปที่ตัวแปล y

การเรียก Index ของ Matrix ก็เหมือนกับ NumPy

การ resize , reshape จะใช้ torch.view

ใน tensor ถ้ามีแค่ 1 ค่าใช้ torch.item() เพื่อดึงค่าของตัวแปรนั้นออกมา

Operation ของ torch มีอีกเป็นร้อย เช่น transposing, indexing, slicing, mathematical operations, linear algebra, random numbers, etc., ดูเพิ่มเติมได้ที่ here

แต่ถ้าเรามี NumPy เราก็ยังสามารถเอา torch tensor มาแปลงเป็น NumPy ได้นะ โดยใช้ .numpy()

ส่วนจาก numpy ไป torch ใช้ torch.from_numpy()

note ไว้ด้วยว่า Tensor ทุกตัวที่ run ด้วย CPU ยกเว้น CharTensor เปลี่ยนกลับไปกลับมา จาก Tensor ไป NumPy หรือ จาก NumPy ไป Tensor ได้

สุดท้ายของบทความนี้เป็น Highlight เลยทีเดียว ว่าด้วยเรื่อง CUDA Tensor เราสามารถเอา tensor ไป run บนเครื่องที่เป็น CPU หรือจะเป็น GPU ผ่าน CUDA ได้ มาลุ้นกันจะ error มั๊ย

นั่นไง run ตอนแรก code ใน tutorial ไม่มี else เงียบกริบผมเพิ่ม else ด้วยเพื่อให้ดูว่าถ้าไม่ support CUDA มันจะไปลง else ซึ่งก็เข้าใจได้ว่าตอนนี้หนังเรื่องนี้กำลังจะจบแล้วเช็คของมีค่าของท่านก่อนออกจากโรงภาพยนต์ค่าาาาาา

ขอบคุณที่ร่วมเข้ามาเริ่มต้นกับ PyTorch บน Colab ด้วยกันนะครับ หากมีข้อแนะนำ ติชม หรือคำถาม (อาจยังตอบไม่ได้ 555 ) สามารถ add fb มาคุยกันได้ครับ

ผมเป้นะครับ https://www.facebook.com/paripol.toopiroh

.

.

.

.

.

.

.

.

.

.

.

แต่เดี๋ยวก่อนเราชอบหนังของ Mavel มันต้องมี after credit ปิดท้าย

ระดับป๊า Google Colab แล้วจะไม่ให้ใช้ GPU เชียวหรออ ความจริงคือ default runtime type ของ Colab เป็น CPU ครับ ถ้าต้องการใช้ GPU หรือ run ผ่าน CUDA เราต้องไปเปลี่ยน runtime type เสียก่อน ตอนก่อนจบคงบ่นผมในใจเรื่องมี GPU แต่จะจบด้วย CPU ได้อย่างไร เข้า menu Runtime -> Change runtime type

แล้วเลือก Hardware accelerator ให้เป็น GPU

Run ใหม่สิครับรออาราย คราวนี้จะเห็นว่ามีการ

สร้าง object device “cuda” ขึ้นมา
device = torch.device(“cuda”)

สร้างตัวแปร y โดยระบุว่าสร้างตรงด้วย device “cuda” บน GPU
y = torch.ones_like(x, device = device)

เก็บค่าตัวแปร x ใหม่โดยอ้างอิงจากตัวแปร x.to(“cuda”)
x = x.to(device)

แล้วที่พี๊ค สั่ง print z ทั้งแบบ GPU และ CPU มาเทียบกัน

โดยสรุป GPU กับ CPU ใน Tutorial นี้อาจยังไม่เห็นประโยชน์การใช้งานอย่างชัดเจน เพราะเรายังไม่ได้นำเอาความสามารถเรื่องความเร็วในการประมวลมาทดสอบเลยแค่ทำให้รู้ว่าใช้ GPU หรือ CUDA อย่างไร ดังนั้นรอตอนต่อไปนะครับ ผมจะลองหาตัวอย่างที่เห็นผลอย่างชัดเจนมาให้ดู

จบจริงละครับ

ขอบคุณครับ

--

--