Bộ công cụ sinh tồn GPU cho kỷ nguyên AI
(journal.hexmos.com)- Phát triển AI không còn đủ nếu chỉ dựa vào thực thi tuần tự kiểu CPU; muốn xử lý tốt hiệu năng huấn luyện và suy luận thì cần hiểu mô hình xử lý song song quy mô lớn của GPU
- CPU thông thường ở phân khúc tiêu dùng có khoảng 2~16 lõi, mạnh ở tác vụ đơn luồng và phân nhánh điều kiện, trong khi GPU có hàng nghìn lõi nhỏ, phù hợp cho phép toán ma trận, xử lý ảnh và deep learning
- AWS cung cấp các môi trường chạy GPU như P3/P4, P5/Inf1, G4 và Amazon SageMaker; p3.2xlarge có giá $3.06/giờ, p5.48xlarge là $98.32, còn g4dn.xlarge ở mức $0.526
- CUDA của NVIDIA cho phép lập trình viên trực tiếp xử lý luồng thực thi song song từ cấp phát bộ nhớ GPU, sao chép dữ liệu, chạy kernel đến biên dịch
- Các ví dụ cộng mảng, tạo Mandelbrot và CNN phân loại mèo/chó cho thấy cách chia vòng lặp tuần tự thành các luồng GPU; Mandelbrot giảm từ 4.07 giây trên CPU xuống 0.0046 giây trên GPU
Vì sao chỉ biết CPU là chưa đủ
- Nhiều lập trình viên đã quen học tập và giải quyết vấn đề theo cách tiếp cận lấy CPU làm trung tâm, nhưng CPU về bản chất vận hành dựa trên kiến trúc tuần tự
- CPU truyền thống thực thi lệnh theo tuyến tính và tối ưu một số ít lõi mạnh cho hiệu năng đơn luồng
- Khi phải xử lý nhiều tác vụ cùng lúc, chi phí xử lý lần lượt từng việc theo cách thực thi tuần tự sẽ tăng lên đáng kể
- Có thể cải thiện hiệu năng bằng multithreading, nhưng triết lý thiết kế cốt lõi của CPU vẫn gần với thực thi tuần tự
Mô hình AI và xử lý song song
- Các kiến trúc AI hiện đại như Transformer tận dụng xử lý song song để tăng hiệu năng huấn luyện
- RNN hoạt động theo tuần tự, nhưng Transformer như GPT có thể xử lý nhiều từ cùng lúc, từ đó nâng hiệu quả huấn luyện và năng lực mô hình
- Huấn luyện song song cho phép xây dựng mô hình lớn hơn, và mô hình lớn hơn tạo nền tảng để cho ra đầu ra tốt hơn
- Tính song song không chỉ áp dụng cho xử lý ngôn ngữ tự nhiên mà còn cho nhận dạng hình ảnh
- AlexNet là ví dụ về việc xử lý đồng thời nhiều phần của ảnh để nhận diện mẫu
- CPU, do được thiết kế xoay quanh hiệu năng đơn luồng, khó phân phối và thực thi hiệu quả khối lượng tính toán song song lớn mà các mô hình AI phức tạp đòi hỏi
Cách GPU giảm nút thắt cổ chai
- GPU được thiết kế với cấu trúc dùng nhiều lõi nhỏ chuyên dụng thay vì các lõi lớn và mạnh như CPU
- Tính song song của GPU đặc biệt phát huy ở các workload phải lặp lại số lượng lớn cùng một loại phép toán, như render đồ họa hay tính toán toán học phức tạp
- Các framework deep learning như TensorFlow được tối ưu để tận dụng hiệu năng GPU nhằm tăng tốc huấn luyện và suy luận mô hình
- Huấn luyện mạng nơ-ron bao gồm rất nhiều phép toán ma trận, và GPU mạnh ở việc song song hóa các phép toán này nhờ số lượng lõi lớn
Sự khác biệt vai trò giữa CPU và GPU
-
CPU
- CPU được thiết kế tập trung vào xử lý tuần tự, nên mạnh ở các tác vụ thực thi tuyến tính theo một luồng lệnh
- Phù hợp với tính toán mục đích chung, tác vụ hệ thống và xử lý thuật toán phức tạp có nhiều nhánh điều kiện
- CPU tiêu dùng thường chỉ có số lõi tương đối ít, trong khoảng 2~16 lõi
- Mỗi lõi có thể xử lý độc lập tập lệnh riêng của mình
-
GPU
- GPU được thiết kế theo kiến trúc song song, rất hiệu quả trong việc xử lý đồng thời nhiều tác vụ con
- Phù hợp cho render đồ họa, tính toán toán học phức tạp và thực thi các thuật toán có thể song song hóa
- Công việc được chia thành các đơn vị song song nhỏ hơn để nhiều phép toán có thể diễn ra cùng lúc
- Số lõi GPU thường lên tới hàng nghìn, được tổ chức thành streaming multiprocessors (SMs) hoặc cấu trúc tương tự
- Phù hợp cho các tác vụ xử lý đồng thời lượng lớn dữ liệu như ảnh/video, deep learning và mô phỏng khoa học
Các môi trường GPU có thể chọn trên AWS
- AWS cung cấp nhiều instance GPU để dùng cho các tác vụ như machine learning
-
Instance GPU đa dụng
-
Instance tối ưu cho suy luận
- Suy luận là quá trình đưa dữ liệu thời gian thực vào mô hình AI đã được huấn luyện để dự đoán hoặc giải quyết tác vụ
- P5 và Inf1 được tối ưu cho suy luận machine learning, nơi độ trễ thấp và hiệu quả chi phí là quan trọng
- p5.48xlarge có giá $98.32/giờ và cung cấp 8 GPU NVIDIA H100, mỗi GPU có 80GB bộ nhớ, tổng cộng 640GB video memory
-
Instance tối ưu cho đồ họa
- G4 instances được thiết kế để xử lý các tác vụ nặng về đồ họa
- Nhà phát triển game có thể dùng G4 instances để render đồ họa 3D cho trò chơi
- g4dn.xlarge có giá $0.526/giờ và dùng 1 GPU NVIDIA T4 với 16GB bộ nhớ
-
Dịch vụ machine learning được quản lý
- Amazon SageMaker là dịch vụ quản lý dành cho machine learning, cung cấp quyền truy cập tới các instance GPU như P3, P4 và P5
- SageMaker phù hợp với các tổ chức muốn bắt đầu với machine learning mà không phải tự quản lý hạ tầng nền tảng
- Có tài liệu riêng về giá Amazon SageMaker
Sử dụng cơ bản NVIDIA CUDA
- CUDA là nền tảng tính toán song song và mô hình lập trình do NVIDIA phát triển, cho phép tăng tốc ứng dụng bằng cách tận dụng GPU accelerator
- Ví dụ minh họa luồng phát triển CUDA gồm cấp phát bộ nhớ GPU, sao chép dữ liệu, chạy kernel và lấy kết quả về
-
Quy trình cài đặt
- Tải base installer và driver installer từ CUDA
- Thêm các biến môi trường sau vào
.bashrctrong thư mục homeexport PATH="/usr/local/cuda-12.3/bin:$PATH"export LD_LIBRARY_PATH="/usr/local/cuda-12.3/lib64:$LD_LIBRARY_PATH"
- Chạy các lệnh sau
sudo apt-get install cuda-toolkitsudo apt-get install nvidia-gds
- Khởi động lại hệ thống để áp dụng các thay đổi
-
Các lệnh kiểm tra hữu ích
lspci | grep VGA: nhận diện và liệt kê GPU trong hệ thốngnvidia-smi: cung cấp thông tin chi tiết như mức sử dụng, nhiệt độ và lượng bộ nhớ dùng của GPU NVIDIAsudo lshw -C display: cung cấp thông tin về bộ điều khiển hiển thị như card đồ họainxi -G: hiển thị thông tin về subsystem đồ họa bao gồm GPU và màn hìnhsudo hwinfo --gfxcard: dùng để xem thông tin chi tiết về card đồ họa của hệ thống
Song song hóa phép cộng mảng bằng CUDA
- Cộng mảng là một bài toán phù hợp để giải thích song song hóa bằng GPU
- Các mảng ví dụ là
A = [1,2,3,4,5,6],B = [7,8,9,10,11,12], và kết quả làC = [8,10,12,14,16,18] - Theo cách CPU, ta duyệt từng phần tử mảng và thực hiện phép cộng lần lượt
- Khi dữ liệu tăng lên, thời gian của cách tuần tự cũng tăng, trong khi GPU có thể thực hiện đồng thời các phép tính như
1+7,2+8,3+9 - Ví dụ CUDA dùng file kernel
.cu__global__biểu thị hàm kernel được gọi trên GPUvectorAddnhận ba con trỏ số nguyêna,b,cvà thực hiện phép cộng vectorthreadIdx.xlấy chỉ số của luồng hiện tại- Mỗi luồng lưu tổng của phần tử tương ứng vào
c[i]
- Hàm
maindiễn ra theo thứ tự cấp phát bộ nhớ GPU, sao chép dữ liệu, chạy kernel rồi sao chép kết quảcudaMalloccấp phát bộ nhớcudaA,cudaB,cudaCtrên GPUcudaMemcpysao chépa,btừ host sang GPUvectorAdd <<<1, sizeof(a) / sizeof(a[0])>>>dùng để chạy kernel- Vector kết quả
cudaCđược sao chép từ GPU về host
- Việc biên dịch và chạy sử dụng lệnh
nvcc - Có cung cấp toàn bộ mã nguồn
Tận dụng GPU trong tạo ảnh bằng Python
- Tạo tập Mandelbrot là công việc xây dựng các mẫu thị giác phức tạp dựa trên hành vi của các con số trong một phương trình nhất định, và đây là tác vụ ngốn tài nguyên
- Ví dụ Python chạy trên CPU duyệt qua từng pixel để tính giá trị Mandelbrot, và mất 4.07 giây để tạo ảnh 1024×1536
- Phiên bản tăng tốc bằng GPU sử dụng Numba library
- Decorator
@jitthực hiện biên dịch Just-In-Time để chuyển mã Python thành mã máy cuda.jitđược dùng để tạomandel_gpu, vớidevice=Trueđể chạy trên GPUmandel_kernelchạy trên CUDA GPU và phân chia tác vụ tạo Mandelbrot cho các luồng GPU
- Decorator
create_fractal_gputhực hiện cấp phát bộ nhớ GPU, thiết lập luồng và block, chạy GPU kernel, đồng bộ hóa và sao chép kết quả- Sử dụng
threadsperblock = (16, 16) cuda.synchronize()đợi GPU hoàn tất công việcd_image.copy_to_host(image)sao chép kết quả về phía CPU
- Sử dụng
- Thời gian chạy trên GPU là 0.0046 giây, nhanh hơn rất nhiều so với mã chạy trên CPU
- Có cung cấp toàn bộ mã nguồn
Huấn luyện mạng nơ-ron phân loại mèo/chó bằng GPU
- Để cho thấy GPU được dùng trong AI như thế nào, ví dụ mạng nơ-ron phân biệt mèo và chó được sử dụng
- Các phần cần chuẩn bị trước là CUDA và TensorFlow
- TensorFlow có thể được cài bằng
pip install tensorflow[and-cuda] - Dataset sử dụng Kaggle Dogs vs. Cats
- Sau khi tải về, sắp xếp ảnh mèo và chó vào các thư mục con khác nhau trong thư mục huấn luyện
- TensorFlow có thể được cài bằng
- Mô hình sử dụng mạng nơ-ron tích chập (CNN)
- pandas và numpy được dùng để thao tác dữ liệu
Sequentialđược dùng để xếp chồng tuyến tính các layer của mạng nơ-ronConvolution2D,MaxPooling2D,Dense,Flattenlà các layer cấu thành CNNImageDataGeneratorđược dùng để tăng cường dữ liệu theo thời gian thực trong lúc huấn luyện
- Dữ liệu huấn luyện được nạp bằng
ImageDataGenerator- Với dữ liệu huấn luyện, áp dụng
rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True - Ảnh đầu vào được đặt kích thước
(64, 64), batch size 32 và chế độ phân loại nhị phân
- Với dữ liệu huấn luyện, áp dụng
- Cấu trúc CNN gồm các layer tích chập, max pooling, flatten, Dense và đầu ra sigmoid
- Mô hình được biên dịch với optimizer
adam, lossbinary_crossentropyvà metricaccuracy - Quá trình huấn luyện chạy với
epochs=25,validation_steps=2000, sau đó lưu vào file.h5bằngclassifier.save('trained_model.h5') - Mã suy luận nạp
trained_model.h5, chuyển ảnh về kích thước(64, 64), rồi nếu giá trị dự đoán từ 0.5 trở lên thì in radog, ngược lại làcat - Có cung cấp toàn bộ mã nguồn
Phạm vi ứng dụng của GPU
- Trong kỷ nguyên AI, rất khó bỏ qua năng lực của GPU, và lập trình viên cần hiểu rõ hơn về khả năng của nó
- Khi chuyển từ các thuật toán tuần tự sang thuật toán song song, GPU trở thành công cụ để tăng tốc các phép tính phức tạp
- Khả năng xử lý song song của GPU đặc biệt có lợi cho việc xử lý các dataset lớn và kiến trúc mạng nơ-ron phức tạp trong AI và machine learning
- GPU không chỉ được dùng trong machine learning truyền thống mà còn cả trong nghiên cứu khoa học, mô phỏng và các tác vụ ngốn dữ liệu
- Năng lực xử lý song song này được ứng dụng để giải quyết vấn đề trong nhiều lĩnh vực như khám phá thuốc, mô hình hóa khí hậu và mô phỏng tài chính
1 bình luận
Ý kiến trên Hacker News
Mã trong bài này sai. CUDA kernel hoàn toàn không được gọi: https://github.com/RijulTP/GPUToolkit/blob/f17fec12e008d0d37...
90% thời gian “tính toán” tập Mandelbrot bằng mã JIT compile không dùng cho tính toán thực sự, mà dùng để compile hàm
Nếu muốn học CUDA cho đúng, triển khai phép nhân ma trận là một bài tập tốt; các tutorial đáng tham khảo là https://cnugteren.github.io/tutorial/pages/page1.html và https://siboehm.com/articles/22/CUDA-MMM
Nó nhận hai vector dấu phẩy động 32-bit X và Y cùng một vô hướng A, nhân mỗi X[i] với A rồi cộng vào Y[i]: https://developer.nvidia.com/blog/six-ways-saxpy/
Bài viết tuy khẳng định “mọi developer đều nên biết”, nhưng thực tế gần với một bài nói về cách GPU được dùng trong AI hơn. Phần lớn developer không phải là developer AI, cũng không trực tiếp tương tác với AI hay trực tiếp dùng GPU
Hơn nữa, bài gần như không đề cập đến đồ họa 3D, lý do cốt lõi khiến GPU ra đời
Có kiến thức cơ bản cũng giúp bạn hiểu rõ hơn những câu chuyện “AI” được bán cho quản lý
Thái độ “không cần biết lĩnh vực lân cận” là điều tôi thường thấy ở trường. Ở mảng quản trị hệ thống, các bạn cùng khóa nói không cần biết lập trình, nhưng rồi vẫn cần scripting; ở trường phát triển phần mềm, người ta nói không cần biết mạng, nhưng vài năm sau DevOps xuất hiện rộng rãi trong các tin tuyển dụng
Nếu bài viết dài khoảng 1.500 từ thì đọc kỹ như học cũng chỉ mất chừng 12 phút; kể cả chạy thử các ví dụ mã và tốn khoảng 2 giờ thì cũng không phải khoản đầu tư lớn. Tất nhiên với điều kiện bài đó là một tài liệu nhập môn tốt
curl. Tôi vẫn là developer embedded, nhưng sau đó đã học nhiều về backend, frontend và hạ tầng; trong vài năm tới, có vẻ khả năng cao toàn ngành cũng sẽ có tình huống tương tự với AITôi cho rằng lý do Python thống trị trong AI là vì quan hệ Python-C giống với quan hệ CPU-GPU
GPU có hiệu năng rất tốt nhưng khó lập trình trực tiếp, nên mọi người điều khiển GPU thông qua các lệnh gọi API cấp cao như PyTorch
C cũng có hiệu năng tốt nhưng khó lập trình, nên Python được dùng như một lớp trừu tượng bên trên C
Không rõ mọi người có cần hiểu GPU sâu đến vậy không. Điều này càng đúng nếu bạn không đi sâu vào huấn luyện hay vận hành AI; và nếu định luật Moore kết thúc, còn multithreading trở thành cách chính để tăng tốc, thì có khả năng sẽ xuất hiện các ngôn ngữ mới phù hợp với paradigm lập trình song song. Mojo trông giống như điểm khởi đầu cho hướng đó
Từ các phép tính lặp đơn giản, mọi lệnh đều được thiết kế để phía sau tự động tận dụng song song tất cả core CPU một cách thông minh, và chuyển những việc có thể sang GPU
Tôi tò mò liệu đã từng có nỗ lực như vậy chưa, hoặc ngay từ đầu điều đó có khả thi không
Cách giải thích “khi CPU gặp nhiều tác vụ, nó phân bổ tài nguyên để xử lý từng tác vụ một” quá đơn giản. Thậm chí tôi còn ước CPU vẫn đơn giản đến mức đó
Việc bài viết tập trung vào mô hình lập trình là hợp lý, nhưng xét từ góc độ hiệu năng, nói “CPU thực thi lệnh tuần tự” về cơ bản là sai. Pipeline thực thi lệnh song song, cũng có SIMD, và nhiều core cũng có thể cùng xử lý một vấn đề
Khác biệt lớn là CPU dùng nhiều silicon và điện năng cho xử lý luồng điều khiển để chạy hiệu quả một thread, trong khi GPU dùng các tài nguyên đó cho nhiều đơn vị tính toán hơn và chạy rất nhiều thread để che giấu độ trễ của luồng điều khiển và bộ nhớ
Nói CPU phù hợp với mã tuần tự còn GPU phù hợp với mã song song thì đúng ở một mức nào đó, nhưng là một phép xấp xỉ khá thô. Nếu giả định ngân sách điện năng tương tự nhau ở mức vài trăm watt, CPU có khoảng 100 “lõi” thực thi từng tác vụ độc lập một, tính cả hyper-thread, và che giấu độ trễ bộ nhớ bằng dự đoán rẽ nhánh và pipelining
GPU có khoảng 100 “đơn vị tính toán”, mỗi đơn vị chạy xen kẽ khoảng 80 tác vụ độc lập và che giấu độ trễ bộ nhớ bằng cách thực thi lệnh tiếp theo của tác vụ khác
Thuật ngữ khá rối rắm; CPU nhiều khả năng có đơn vị vector rộng 256-bit, còn GPU có đơn vị vector rộng 2048-bit, nhưng nhìn từ xa một chút thì hai kiến trúc trông khá giống nhau
Có thể gọi nó là Xeon Chi
Trong khi hầu hết ngôn ngữ lập trình được thiết kế cho xử lý tuần tự như CPU, Erlang/Elixir được thiết kế cho tính song song như GPU, nên tôi tò mò liệu Nx / Axon có nổi lên không: https://github.com/elixir-nx/
Cần có hướng dẫn mua sắm. Tôi muốn biết tối thiểu phải chi bao nhiêu và lựa chọn tốt nhất theo từng mức ngân sách là gì. Vấn đề là thông tin đó thỉnh thoảng thay đổi, và tôi không biết có tài liệu nào được duy trì cập nhật liên tục không
https://colab.google/
https://www.kaggle.com/docs/notebooks
https://www.paperspace.com/gradient/free-gpu
Lại quay về kiểu bài câu click “mọi lập trình viên cần biết” rồi à
Tôi thích những bài đối diện trực tiếp với độ phức tạp, và vì có phần nào hiểu cả phương pháp định lượng lẫn các chi tiết định tính trong những lĩnh vực như phần cứng máy tính, nên tôi thấy đáng mừng khi có bài giải thích kỹ chi tiết của một lĩnh vực
Ví dụ, việc “What every programmer should know about memory” có phải là thứ mọi lập trình viên đều cần biết hay không là chuyện khác, nhưng một lập trình viên giỏi nên có cảm giác về cách máy tính thực sự vận hành. Ý chính rút ra từ bài đó là tính cục bộ thường tự nhiên xuất hiện trong mã tốt: nhanh, dễ theo dõi và phù hợp với vấn đề
Bài viết hay, nhưng AWS P5 instance, cùng với P4d và P4de, rõ ràng được nhắm nhiều hơn cho huấn luyện chứ không phải suy luận. Các loại instance phù hợp hơn cho suy luận lần lượt là G4dn và G5, dùng GPU T4 và A10G
Tôi gần như mới bắt đầu với lập trình GPU, nhưng đọc bài này thấy thú vị. Thật ngạc nhiên là mọi thứ đã phát triển đến mức có thể huấn luyện một mạng nơ-ron “chó hay mèo” đơn giản dễ dàng như vậy