Thứ Hai, tháng 4 18, 2016

HPC(5) - chọn lựa phần cứng Motherboard và CPU

Computers  are useless. They can only give you answers. - Pablo Picasso
Như ở phần HPC 4 build trước, tôi đã giới thiệu về chọn lựa 4 card GPU GTX 780 Ti với tản nhiệt khí ACX 2.0 (2 quạt). Việc này cũng tạo rất nhiều "khoảng trống" để tôi tìm cách làm mát - xử lý nhiệt lượng -  khi GPU chạy hết tốc lực cho Deep Learning (DL). Đó là chuyện chút nữa nhé.

Giờ thì tranh thủ lý giải về 2 thành phần quan trọng khác, vốn luôn được tôn thờ và cân nhắc đầu tiên trong khi bắt tay vào dựng các dàn máy tính thông dụng: CPU - vi xử lý trung tâm -"bộ não" và motherboard - bo mạch chủ -"cơ thể". Tất nhiên, khi xây dựng đặc tả cho dàn máy chạy Deep Learning lần này, tôi đã bắt đầu với GPU trước tiên nhưng kế ngay sau đó là quyết định về 2 thành phần cần đặc biệt chú tâm tới ở trên.
Một yêu cầu phổ dụng để hỗ trợ tốc độ xử lý của GPU trong tổng thể 1 HPC là phải đáp ứng lượng dữ liệu dịch chuyển trong hệ thống ở băng thông và tốc độ đủ lớn để giúp tránh nghẽn cổ chai nhằm tận dụng năng lực của hàng nghìn nhân CUDA chạy song song hết tốc lực. Chuẩn kết nối thần thánh trong giới game thủ SLI Link của NVIDIA  chỉ đạt tốc độ tới 1GB/s, hầu như là quá chậm để tạo bộ đệm dữ liệu kịp thời cho năng lực xử lý của GPU. Thế nên, kể cho đúng ra, thì cái cầu nối 4 way-SLI tôi gắn trên HPC của mình làm màu cho vui và giữ 4 GPU thành khối gắn kết vững chắc hơn mà thôi :D. Cầu nối 4-way SLI  nguyên bản đi kèm với bo mạch chủ ASUS là bản mạch đen gắn chặt 4 đầu GPU lại với nhau như hình dưới.

image

Trong DL ở đây, việc giao tiếp và đồng bộ dữ liệu giữa các GPU sẽ chỉ còn thông qua khe PCI-e trên bo mạch chủ. Dữ liệu do CPU từ bộ nhớ RAM tới GPU cũng thông qua các cổng này. Luồng dữ liệu cơ bản dịch chuyển thực tế phức tạp hơn nhưng trong khuôn khổ bài viết này, tôi xin đơn giản hoá cho ngắn gọn như sau:
Neuron Network <--> Network card <--> [HDD/SSD<-->RAM<-->CPU<-->VRAM<-->GPU] x 4

Từ đó, có thể thấy hai yếu tố kết nối cơ bản trực tiếp liên quan và xác định năng lực hệ thống HPC chính là:

01. PCI-e trên bo mạch chủ (PCI:Peripheral Component Interconnect - Kênh liên kết các thiết bị ngoại vi) và

02. QPI trên CPU (QPI: Intel QuickPath Interconnect).

Hầu hết các bo mạch chủ ngày nay sử dụng các khe cắm mở rộng PCI Express để kết nối với card đồ hoạ. Đến giờ đang tồn tại các tiêu chuẩn PCI Express như sau:
PCIex

Chuẩn PCI-e hiện hành cao nhất là 3.0 với băng thông x16 (16 làn) Số làn chính là số "đường dây đồng" vật lý liên kết các thiết bị lại với nhau. Từ đó, ở góc độ vật lý, bạn sẽ thấy động dài của các khe cắm này. Tuy nhiên, tốc độ của 1 khe cắm cũng rất linh hoạt, chạy từ x1, x2, x4, x8 hay x16 và để ý kĩ thì trên mạch in bo mạch cũng sẽ in rõ tốc độ tối đa của từng khe cắm PCI-e (3.0 x16 chẳng hạn). Nói chung, nếu thiết bị với khe dài thì không cắm vừa khe ngắn nhưng phần lớn các thiết bị ngắn cắm được vào khe dài và bo mạch chủ sẽ tự tính toán để giảm tốc độ và làn băng thông tương ứng.  Dưới đây là một ảnh minh hoạ.

PCIExpress

Để có thể nuôi dưỡng 4 GPU 780 Ti khủng mà tôi chọn ở tốc độ cao nhất, tôi phải đi kiếm tìm bo mạch chủ có thể đáp ứng việc cấp dữ liệu x16 đồng thời trên cả 4 khe cắm. Hầu như mọi kết quả tìm kiếm và tìm hiểu với tiêu chí trên đều đưa tới kết quả một, ASUS Z10PE-D8 WS,  bo mạch dành cho máy trạm làm việc (Workstation) hàng đầu, chất lượng cực đỉnh, có thể hỗ trợ tối đa 4 card đồ hoạ chạy hết tốc lực tại PCI-e 3.0 x16. Bo mạch chủ này có đủ 4 khe PCIe-x16 bố trí cách nhau với độ rộng 2 khe, đồng thời chạy được x16 cùng lúc cả ở 4 kết nối PCI-e màu xám, cách nhau đều đặn bở 3 khe PCIe x8 đen. Tổng số là 7 khe PCI-e tất cả với đặc tả trong sách đi kèm như sau:
  • 4x PCIe 3.0/2.0 x16 (dual x16 or quad x8; light gray)

  • 2x PCIe 3.0/2.0 x16 (dual x16; dark gray)

  • 1x PCIe 3.0/2.0 x16 (dual x8; dark gray)
Chính vì với 7 khe PCI-e mà bo mạch này to hơn hẳn kích thước Full ATX thông thường mà bước sang chuẩn công nghiệp không dành cho người dùng thông thường, bo mạch server ngoại cỡ theo chuẩn SSI - EEB (Server System Infrastructure - Enterprise Electronics Bay).

6866_11_asus_z10pe_d8_ws_dual_cpu_intel_c612_workstation_motherboard_review_full

Tuy nhiên, chuẩn PCI-e với số làn như trên chỉ có thể có được trên các bo mạch Intel khi mà có số lược QPI tương ứng từ CPU để có thể cấp phát được băng thông dữ liệu tương ứng. QPI là một kiến trúc mới của Intel từ năm 2008 nhằm kết nối dịch chuyển dữ liệu vào ra I/O với các thiết bị ngoại vi. Đi vào chi tiết thì hơi loằng ngoằng nhưng mỗi CPU Intel nói chung có tối đa 40 làn dữ liệu QPI. Có nhiều thứ liên quan đến giá bán của một bộ vi xử lý CPU nhưng CPU có QPI 28 làn rẻ hơn rất nhiều so với CPU có QPI 40 làn. Nếu không tinh ý sẽ rất  dễ bị bỏ qua khi đánh giá lựa chọn mua. Ví như core I7 5820K chạy tốc độ 3.3GHz cao hơn Core I7 5960X chạy ở tốc độ 3.0GHz nhưng giá thì chưa đến một nửa đấy nhé.

1 - Processors

Với PCI-e 3.0 chạy với tốc độ cơ bản là 8GT/s. Cách tính toán băng thông QPI chi tiết khá rắc rối, phụ thuộc cả vào tốc độ xung nhịp chạy QPI trên CPU nhưng cơ bản cũng luồng dữ liẹu cũng đạt tầm 1GT/s cho mỗi làn. Vậy với QPI 40 làn, thì có thể đảm bảo dữ liệu vận chuyển tốc độ cao tới 3 thiết bị PCI-e kiểu như: 40 = 2 x16 + 1 x8. Với 4 GPU chạy x16 thì QPI cần tới 16 x4 = 64 làn. Thế là mình phải dùng bo mạch 2 CPU Xeon để có được 40 x 2 = 80 làn QPI. Ngoài ra, cứ 2 nhân CPU thì sẽ có 1 nhân "canh" chạy full load 100% cấp dữ liệu đệm cho 1 GPU và 1 nhân "cò quay", nên với hệ thống 4 GPU thì cũng cần ít nhất là 8 nhân CPU. Và theo tính toán băng thông thì CPU cũng không cần phải nhanh quá, tầm loanh quanh 2GHz trở lên cũng ổn rồi. Trên cơ sở đó, việc chọn lựa bo mạch ASUS Z10PE-D8 WS cùng với 2 CPU Xeon Haswell E5-2683 v3 14 nhân - 28 luồng là lựa chọn phù hợp (quá mức cần thiết cho DL, lợi thế cho rendering ấy chứ!!!) Dưới đây là cái cách mà bo mạch chủ trứ danh này phân tán 80 làn QPI đến các cổng PCI-e, đảm bảo cả 7 khe PCI-e này luôn có thể đạt tốc độ giao tiếp dữ liệu cao nhất. Khe 5 & 7 được thiết kế x16 trực tiếp với con CPU2, còn lại 2 khe 1 và 3 sẽ có cơ chế tự động chuyển mạch chạy với 2 x8 = x16 hay x8 tuỳ thuộc khe 2 hay khe 4 có thiết bị kết nối hay không như sơ đồ bên dưới.
6866_59_asus_z10pe_d8_ws_dual_cpu_intel_c612_workstation_motherboard_review

Kiến trúc QPI ra đời từ năm 2008 thay đế cho FSB (Front side bus) và năm bên ngoài nhân lõi kể từ đời Nehalem với cách tính lưu lượng dữ liệu khác phức tạp. Có thể hiểu mỗi QPI là một đường cao tốc gồm có 2 chiều đường, mỗi chiều có 20 làn kết nối dữ liệu từ điểm A tới điểm B và mỗi chiều đường lại có thêm 1 làn khẩn cấp nhằm đồng bộ tốc độ xung nhịp clock. QPI chạy ở xung nhịp 2.4GHz, 2.93GHz, 3.2GHz, 4.0GHz hay 4.8GHz (4.0GHz là từ dòng CPU Sandy Bridge-E/EP và 4.8GHz là từ Haswell-E/EP) . Cách tính lưu lượng dữ liệu ví như ở xung nhịp 4.8GHz của Haswell E/EP như sau:

4.8GHz x 2 bit/Hz (double data rate) x 16 (20) data bits/ QPI băng thông) x 2 (2 chiều nhận gửi cùng lúc) / 8 (bits/byte) =  38GB/s. 

Dưới đây là sơ đồ vi kiến trúc của Nalehem khi khái niệm QPI được giới thiệu lần đầu. QPI nằm cùng trên miếng silicon CPU nhưng lại là thành phần Uncore trong vi kiến trúc của bộ xử lý x86 Intel
1024px-Intel_Nehalem_arch.svgCuối cùng, ngoài việc cân nhắc tích hợp thiết kế hệ thống phù hợp về kỹ thuật để tránh nghẽn cổ chai băng thông dữ liệu cần tính toán cho GPU khi chạy các thuật toán cho Deep Learning thì việc xử lý nhiệt lượng làm mát để các GPU đang hết tốc lực như từ đầu bài viết này cũng là một yếu tố cần cân nhắc, khác hẳn với hệ thống SLI chỉ để chơi game truyền thống. GPU tự động tăng tốc lên cao nhất chỉ vài phút chạy các thuật toán DL, chạm ngưỡng giới hạn nhiệt của GPU (tầm 85 0C) dẫn đến giảm tốc độ nhân xử lý trong khi quạt rú ầm ầm để làm mát nhằm tránh nướng chín GPU. Điều chỉnh vòng tua để quạt GPU kick-in ở tốc độ cao sớm hơn tại mức nhiệt thấp là một cách phổ biến (early fan curve) của dân OC GPU trên windows, còn trên Ubuntu Linux thì sẽ là 1 trò hack khá loằng ngoằng mà tôi mất trọn 1 ngày-đêm chọc ngoáy trên 4 con GPU ở hệ thống HPC của mình trên đây. Có dịp, tôi sẽ chia sẻ thêm mình đã thành công script-hacking điều khiển quạt ở Nvidia GPU này thế nào ở một bài viết riêng khác.  Cuối cùng, để có thể làm mát 4 con GPU kẹp sandwich của mình, tôi đã phải quan sát và thử nghiệm luồng gió mát cấp vào tản nhiệt của GPU khá nhiều trước khi bố trí quạt và công suất quạt hợp lý hơn.
Mỗi GPU có 2 quạt 90mm đi kèm hút gió cửa trước thổi thẳng vào tản nhiệt, gió nóng sẽ theo các khe nhiệt chạy thẳng lên trên (80%) và 20% ra sau, phía cổng kết xuất màn hình của mỗi card. Ngoại trừ GPU(4) ngoài cùng thì các GPU(3,2,1) bên trong thì đều bị hút khi nóng ở khe hở rất nhỏ từ mặt bo mạch GPU trước đó để làm mát. Vì thế, tôi có lắp thêm 1 quạt 120mm tạo áp lực cấp gió mát từ ngoài thẳng vào dọc 3 khe hẹp giữa 4 card (chỗ chụp dẫn hướng gió DIY EVGA Enthusiast Built)  và một quạt 140mm tăng tốc hút khí nóng lên trên từ cả cụm 4 card.
Với suy nghĩ và tính toán khi động học như trên, tôi đã dựng hệ thống tản nhiệt khí hoàn toàn, đáp ứng các thuật toán DL chạy khá tốt trong một chu trình dài.


Và cuối cùng thực nghiệm lý thuyết trên cơ bản có thành công nhất định sau rất nhiều điều chỉnh:


Làm gọn gàng và tối ưu hoá dòng không khi làm mát gồm cả xoay tản CPU để CPU 1 và 2 đều có hút khi mát từ ngoài vào làm mát CPU cũng đồng thời làm mát Backplate của GPU(1) trong trường hơp GPU(1) chạy full load, hoặc hâm nóng theo CPU tý chút khi GPU(1) idle (từ 38oC lên tầm 41oC).


Khi chưa ứng dụng các sắp xếp tinh chỉnh khí động học thì hệ thống luôn ở trạng thái đun nước pha trà, luộc trứng với 4 card GPU chạy loanh quanh vùng 95 - 99oC lờ đờ giảm xung do quá nhiệt. Áp dụng vào rồi thì GPU chạy max cho đến khi hoàn thành thuật toán trong ngưỡng nhiệt cho phép <= 85oC.

image

Kết quả hiện giờ, tôi có 1 chiếc HPC đa mục đích, tạm thời phần nào thoả mãn nhu cầu tìm hiểu và học tập môn Deep Learning và cũng đủ dùng cho các tác vụ đa nhiệm, xử lý đồ hoạ, render video nặng của mấy em thiết kết đồ hoạ trong công ty. Ít ra, tôi đang mong chờ thêm đánh giá chuyên môn của các em ấy từ việc sử dụng cỗ máy HPC cho chạy Adobe After Efects làm film hoạt hoạ.

Thứ Ba, tháng 4 12, 2016

Bộ thư viện NVIDIA GPU REST Engine (GRE)

GPU thực chất cũng là một bộ vi xử lý song song cực kỳ hiệu quả có thể cung cấp dịch vụ có độ trễ thấp đáp ứng các yêu cầu gửi riêng rẽ không trùng lắp.



NVIDIA GPU REST Engine (GRE) là một cấu phần quan trọng cho các nhà phát triển xây dựng các dịch vụ web có độ trễ thấp. GRE bao gồm một máy chủ đa luồng HTTP cung cấp dịch vụ web RESTful và phân tải các yêu cầu đó một cách hiệu quả trên nhiều bộ xử lý đồ họa NVIDIA. Tổng thời gian đáp ứng cơ bản sẽ chỉ phụ thuộc vào mức độ nhu cầu tính toán của người dùng, còn bản thân GRE không làm nặng thêm mấy và còn có thể giải quyết các yêu cầu rỗng (null-request) dưới 10 micro giây.



Các dịch vụ web trên nền tảng GRE nhận yêu cầu được gửi đến, tìm nạp dữ liệu đầu vào và lập lịch lượng tử cho các đầu việc xếp trên một hàng đợi theo phương thức dịch vụ không đồng bộ. Một luồng xử lý riêng biệt dành cho quản lý công việc trên mỗi GPU và đảm bảo rằng tất cả các GPU trong hệ thống được cấp liên tục các yêu cầu từ hàng đợi không đồng bộ.

GRE sử dụng một kỹ thuật gọi là "độ trễ ẩn" cho hiệu năng thông lượng cao. Tức là, khi các dữ liệu cho một yêu cầu cụ thể đang được xử lý bởi một GPU thì cùng lúc đó, dữ liệu cho các yêu cầu tiếp theo được chuẩn bị và kết quả từ các yêu cầu trước đó nữa được trả về cho bên gửi yêu cầu. Tất cả diễn ra song song. Toàn bộ hàng đợi được sắp xếp một cách hiệu quả nhất có thể. Ở rất nhiều tình huống, GPU không bao giờ phải chờ đợi dữ liệu đầu vào.

Các nhân xử lý hình ảnh Nvidia (ICE: Nvidia Image Compute Engine) là điển hình cho thể thức vi dịch vụ cung cấp bởi GRE thông qua khả năng tăng tốc GPU trong xử lý và điểu chỉnh kích cỡ hình ảnh dành riêng cho dịch vụ web và các ứng dụng di động.

Các lập trình viên có thể tự xây dựng các dịch vụ này và tăng tốc theo cùng phương thức.  Khởi đầu với GRE, LTV có thể tập trung vào việc thực hiện các thuật toán cho các dịch vụ đang cần được tăng tốc. LTV sẽ phải xác định được các dữ liệu cần thiết gửi cho thuật toán của mình qua URL là gì. Sau đó, LTV chỉ cần tạo các hàm số chạy trên dữ liệu đó. Ví như bạn định tiến hành xử lý âm thanh nào đó, bạn có thể chỉ cần viết một hàm GPU hoặc gọi một chức năng thư viện tăng tốc GPU hiện tại từ các bộ thư viện nguyên mẫu NPP (NVIDIA Performance Primitives) để có mẫu đầu vào cùng với một vài thông số điều chỉnh rồi áp dụng các chuyển đổi.

Bản thử nghiệm bộ công cụ GRE hiện giờ đã cho phép bạn xem xét thành phần tạo lịch và chạy thử các thuật toán riêng của bạn. Bản thử nghiệm này đã gồm sẵn một máy chủ HTTP đơn giản được viết bằng ngôn ngữ Go kèm theo một dịch vụ phân loại hình ảnh cung cấp bởi thư viện học sâu cuDNN (Deep Learning). Các bản GRE thử nghiệm này nhằm đưa ra demo sớm ở góc độ khái niệm học thuật là chính.

(Theo Google Translate có hiệu đính qua qua bằng mắt người từ bản tin cộng đồng Nvidia Developers: https://developer.nvidia.com/gre)