Tháng Ba 6, 2021 yendph

Deep Learning - Cách làm việc với CUDA trong PyTorch

PyTorch là một framework mã nguồn mở của machine learning cho phép bạn thực hiện các phép tính khoa học và phức tạp. Bạn có thể sử dụng PyTorch để tăng tốc độ deep learning với GPU. PyTorch đi kèm với một giao diện đơn giản, bao gồm các đồ thị tính toán động và hỗ trợ CUDA. 

1. PyTorch là gì?

PyTorch là một framework mã nguồn mở dựa trên Python. Nó cho phép bạn thực hiện các tính toán khoa học với sự hỗ trợ của các đơn vị xử lý đồ họa (GPU). Bạn có thể sử dụng nó để phát triển và đào tạo mạng nơ-ron deep learning bằng cách sử dụng tính năng phân biệt tự động (một quá trình tính toán đưa ra các giá trị chính xác trong thời gian không đổi).

Các tính năng chính của PyTorch bao gồm:

  • Giao diện đơn giản — bao gồm một API dễ sử dụng có thể được sử dụng với Python, C ++ hoặc Java.
  • Pythonic về bản chất — tích hợp nhịp nhàng với ngăn xếp khoa học dữ liệu Python và cho phép bạn tận dụng các dịch vụ và chức năng của Python.
  • Đồ thị tính toán — bao gồm các khả năng dành cho đồ thị tính toán động mà bạn có thể tùy chỉnh trong thời gian chạy.

2. Hỗ trợ PyTorch với CUDA

CUDA là một mô hình lập trình và bộ công cụ tính toán được phát triển bởi NVIDIA. Nó cho phép bạn thực hiện các hoạt động máy tính chuyên sâu nhanh hơn bằng cách chạy song song các tác vụ trên các GPU. CUDA là API chính được sử dụng để deep learning mặc dù có các tùy chọn khác, chẳng hạn như OpenCL. PyTorch cung cấp hỗ trợ cho CUDA trong thư viện torch.cuda.

Tạo và sử dụng Tensor

Thư viện CUDA của PyTorch cho phép bạn theo dõi GPU bạn đang sử dụng và khiến bất kỳ bộ tensor nào bạn tạo được tự động gán cho thiết bị đó. Sau khi một tensor được cấp phát, bạn có thể thực hiện các thao tác với nó và kết quả cũng được gán cho cùng một thiết bị.

Theo mặc định, trong PyTorch, bạn không thể sử dụng các hoạt động GPU chéo. Ngoại lệ là việc sử dụng các phương thức copy_ () hoặc copy-like, chẳng hạn như to () và cuda (). Để khởi chạy các hoạt động trên các tensors phân tán, trước tiên bạn phải bật quyền truy cập bộ nhớ ngang hàng.

Thư viện CUDA của PyTorch cho phép bạn theo dõi GPU bạn đang sử dụng và khiến bất kỳ bộ tensor nào bạn tạo được tự động gán cho thiết bị đó. Sau khi một tensor được cấp phát, bạn có thể thực hiện các thao tác với nó và kết quả cũng được gán cho cùng một thiết bị.

Thực thi không đồng bộ

Các hoạt động của GPU là không đồng bộ theo mặc định để cho phép thực hiện song song số lượng lớn hơn các phép tính. Các hoạt động không đồng bộ nói chung là vô hình đối với người dùng vì PyTorch tự động đồng bộ hóa dữ liệu được sao chép giữa CPU và GPU hoặc GPU và GPU. Ngoài ra, các hoạt động được thực hiện theo thứ tự xếp hàng. Điều này đảm bảo rằng các hoạt động được thực thi theo cùng một kiểu như thể các phép tính là đồng bộ.

Nếu bạn phải sử dụng các hoạt động đồng bộ, bạn có thể buộc cài đặt này với biến môi trường CUDA_LAUNCH_BLOCKING = 1. Ví dụ: bạn có thể muốn làm điều này nếu bạn thấy lỗi trên GPU của mình. Thực thi đồng bộ đảm bảo rằng lỗi được báo cáo khi chúng xảy ra và giúp dễ dàng xác định yêu cầu nào đã gây ra lỗi.

Một ví dụ khác cần lưu ý về việc sử dụng các hoạt động không đồng bộ hay đồng bộ là với các phép đo thời gian. Với các hoạt động không đồng bộ, các phép đo của bạn sẽ không chính xác. Để giải quyết vấn đề này trong khi vẫn bật chế độ không đồng bộ, bạn có thể gọi torch.cuda.synchronize () trước khi đo hoặc bạn có thể sử dụng torch.cuda.Event để ghi lại thời gian.

Luồng CUDA

Luồng CUDA là các chuỗi thực thi tuyến tính trên các GPU cụ thể. Các luồng này được tạo theo mặc định trong quá trình hoạt động. Trong mỗi luồng, các hoạt động được tuần tự hóa theo thứ tự tạo. Tuy nhiên, các hoạt động từ các luồng khác nhau có thể được thực hiện đồng thời theo bất kỳ thứ tự tương đối nào. Ngoại lệ là nếu bạn đang sử dụng các phương thức sync () hoặc wait_stream ().

Xin lưu ý rằng nếu bạn đặt luồng mặc định của mình thành “luồng hiện tại”, PyTorch sẽ tự động đồng bộ hóa dữ liệu. Tuy nhiên, nếu bạn đang sử dụng các luồng không phải mặc định, bạn có trách nhiệm thực hiện đồng bộ hóa này.

3. Cách sử dụng CUDA với PyTorch

Có một số lệnh cơ bản bạn nên biết để bắt đầu với PyTorch và CUDA. Điều cơ bản nhất trong số các lệnh này cho phép bạn xác minh rằng bạn có các thư viện CUDA và trình điều khiển NVIDIA cần thiết và bạn có sẵn một GPU để làm việc. Bạn có thể xác minh điều này bằng lệnh sau:

torch.cuda.is_available ()

Giả sử bạn nhận được phản hồi tích cực cho truy vấn này, bạn có thể tiếp tục với các thao tác sau.

Di chuyển tensors với hàm to ()

Mỗi Tensor bạn tạo được gán cho () một hàm thành viên. Chức năng này chỉ định tensor được chỉ định cho thiết bị bạn xác định, CPU hoặc GPU. Khi sử dụng chức năng này, bạn cần gán một đối tượng torch.device làm đầu vào. Đối tượng này có thể là:

cpu

Cuda:{number ID of GPU} 

Khi khởi tạo một tensor, nó thường được đặt trực tiếp trên CPU. Sau đó, bạn có thể di chuyển nó sang GPU nếu bạn cần tăng tốc độ tính toán. Khối mã sau đây cho biết cách bạn có thể chỉ định vị trí này.

if torch.cuda.is_available(): 

 dev = “cuda:0” 

else: 

 dev = “cpu” 

device = torch.device(dev) 

a = torch.zeros(4,3) 

a = a.to(device)

Di chuyển tensors với hàm cuda ()

Bạn cũng có thể sử dụng cuda () để đặt tenxơ. Hàm này nhận một đầu vào đại diện cho chỉ số của GPU mà bạn muốn sử dụng; đầu vào này mặc định là 0. Sử dụng chức năng này, bạn có thể đặt toàn bộ mạng của mình trên một thiết bị duy nhất. Bạn có thể xem một khối mã ví dụ hoàn thành điều này bên dưới.

clf = myNetwork() 

clf.to(torch.device(“cuda:0”))

Đảm bảo sử dụng cùng một thiết bị cho tensors

Mặc dù rất hữu ích khi có thể chỉ định GPU nào sẽ sử dụng cho các bộ căng của bạn, nhưng bạn không muốn phải di chuyển tất cả các bộ căng của mình theo cách thủ công. Thay vào đó, hãy cố gắng tự động tạo tensors trên các thiết bị đơn lẻ. Điều này giúp ngăn chặn chuyển giao giữa các thiết bị và mất thời gian mà các chuyển giao này tạo ra.

Để tự động gán tensor, bạn có thể sử dụng hàm torch.get_device (). Chức năng này chỉ được hỗ trợ cho GPU và trả về chỉ số GPU. Sau đó, bạn có thể sử dụng chỉ số này để định hướng vị trí cho các bộ căng mới. Đoạn mã sau đây cho biết cách sử dụng hàm này.

4. Kết luận

Không nghi ngờ gì nữa, PyTorch hiện đang một mã nguồn mở được các lập trình viên lựa chọn. Với giao diện đơn giản, dễ sử dụng, lựa chọn đa dạng về thư viện, cùng với sự hỗ trợ mạnh mẽ từ cộng đồng chắc chắn sẽ giúp các kỹ sư và ngay cả những người không phải là nhà phát triển đều có thể làm việc dễ dàng.

iRender hiện đang cung cấp GPU Cloud cho dịch vụ AI/Deep Learning để người dùng có thể đào tạo các mô hình của mình. Với máy chủ cấu hình và hiệu suất cao của iRender, bạn có thể cài đặt bất kỳ phần mềm nào bạn cần cho dự án của mình. Chỉ cần một vài cú nhấp chuột, bạn có thể truy cập vào máy chủ của chúng tôi và toàn quyền kiểm soát nó. Việc đào tạo mô hình của bạn sẽ tăng tốc độ nhanh hơn gấp 10 lần hoặc thậm chí 50 lần.

Để biết thêm thông tin, vui lòng đăng ký tại đây và thử sử dụng dịch vụ của chúng tôi! Hoặc liên hệ với chúng tôi qua Zalo 0962 868 890 để được tư vấn và hỗ trợ.

Nguồn: run.ai
Contact

iRENDER FARM

GPU Cloud Service
Remote Render Farm
GPU Cloud for AI/DeepLearning
iRender International

INTEGRATIONS

Autodesk Maya
Autodesk 3DS Max
Blender
Cinema 4D
Houdini
Maxwell
Nvidia Iray
Lumion
KeyShot
UE4
Twinmotion
Redshift
Octane
Modo
LightWave 3D
LuxCore
And many more…

iRENDER TEAM

MONDAY – SUNDAY
Hotline: 0916 806 116
Zalo: 0916 806 116
Skype: iRender Support
Email: [email protected]
CÔNG TY CỔ PHẦN CÔNG
NGHỆ IRENDER VIỆT NAM
MST:0108787752
VPGD: Số 5, ngõ 82 Dịch Vọng Hậu, Cầu Giấy, Hà Nội.

Contact
0916806116 [email protected]