Để giúp cho máy tính của bạn hoạt động được thì không thể thiếu các thiết bị phần cứng máy tính. Đây là một khái niệm khá quen thuộc mà những ai đã sử dụng máy tính đều biết. Các yếu tố này làm cho hệ thống máy tính hoạt động trơn tru bên cạnh các phần mềm. Vậy phần cứng máy tính là gì, phần cứng máy tính bao gồm những bộ phận gì? Dưới đây, Máy Tính Trạm sẽ chia sẻ đến bạn một số thông tin cơ bản nhất, mời bạn cùng theo dõi bài viết này. Mỗi chiếc máy tính mà chúng ta sử dụng hàng ngày đều bao gồm hai phần quan trọng là: phần cứng và phần mềm. Có thể bạn đã khá quen thuộc với các ứng dụng phần mềm máy tính như Unikey, Microsoft Office, trình duyệt Chrome, Cốc Cốc,… Nhưng lại ít lại tìm hiểu về phần cứng máy tính là gì? Các bộ phận cơ bản của phần cứng máy tính gồm những gì? Sau đây sẽ là các thông tin chi tiết. Phần cứng máy tính là gì?Phần cứng (Hardware) được hiểu đơn giản là những thiết bị bên trong và bên ngoài máy tính mà người dùng có thể nhìn thấy và cầm được. Phần cứng chính là các bộ phận cần thiết để cấu thành một chiếc máy tính, bao gồm:
Phần cứng máy tính - Phần bên ngoài: Màn hình máy tính, bàn phím keyboard, chuột máy tính mouse, tai nghe headphone, máy in, máy chiếu, loa, USB,.. - Phần bên trong: bộ nguồn, chip CPU, bo mạch chủ mainboard, RAM, ROM, card màn hình card âm thanh, quạt tản nhiệt, Modem… cùng một số Drive như: Bluray, DVD, CD-ROM, ổ cứng, ổ đĩa mềm,… Phần cứng máy tính được sản xuất bởi các thương hiệu máy tính như là: Dell, Asus, Lenovo,… Đây là một bộ phận quan trọng để giúp cho máy tính của bạn vận hành một cách tốt nhất. Tìm hiểu về phần cứng máy tínhTrong phần cứng máy tính bao gồm những bộ phận chủ yếu như sau: Bộ xử lý trung tâm (CPU) Nhắc đến phần cứng máy tính chắc chắn không thể bỏ qua bộ xử lý trung tâm (CPU). Nó đóng vai trò xử lý các dữ liệu, tác vụ của máy tính, điều khiển thiết bị đầu ra, đầu vào. Tốc độ và hiệu suất của CPU là một trong những điểm quan trọng nhất giúp đánh giá một chiếc máy tính có hoạt động hiệu quả hay không? CPU chính xác là một tấm vi mạch nhỏ chứa tấm wafer silicon bên trong bọc một con chip bằng gốm và được gắn liền vào bảng mạch. Tốc độ của CPU được đo bằng đơn vị Hz, giá trị này càng lớn thì CPU hoạt động càng mạnh hơn.
Phần cứng máy tính là một bộ phận quan trọng trong máy tính RAM Đây là một loại bộ nhớ truy cập ngẫu nhiên, hình thành không gian nhớ “tạm” cho máy tính hoạt động. RAM chỉ là vị trí tạm thời ghi nhớ những tác vụ để giúp CPU xử lý nhanh hơn. Khi máy tính tắt đi thì bộ nhớ RAM cũng xóa hết các dữ liệu đã lưu trước đó. Bộ nhớ RAM cũng gồm những tấm wafer silicon, bọc trong chip gốm và gắn cố định trên bảng mạch. Dung lượng của bộ nhớ RAM được do bằng đơn vị là GB. Trong một chiếc máy tính, RAM có dung lượng càng lớn thì máy tính càng có khả năng mở nhiều ứng dụng cùng lúc mà không bị chậm. Dung lượng và bus RAM sẽ ảnh hưởng đến tốc độ và khả năng xử lý các tác vụ của máy tính. Có thể hiểu thông số này càng cao thì khả năng xử lý đa nhiệm càng tốt hơn. Ổ cứng Đây là nơi để lưu trữ phần mềm, hệ điều hành, các dữ liệu mà bạn lưu sẽ không bị mất đi khi bạn tắt máy hay cài đặt lại phần mềm. Dung lượng lưu trữ của ổ cứng cũng được tính bằng đơn vị GB, một ổ cứng thông thường trên các thiết bị máy tính có thể chứa đến 500 GB. Ngoài ra, hiện nay các nhà sản xuất còn giới thiệu thêm một loại ổ cứng rắn là SSD, hỗ trợ cho tốc độ đọc, ghi nhanh hơn và độ tin cậy cao hơn. Và để có được những ưu điểm vượt trội này thì giá thành của ổ cứng SSD cũng đắt đỏ hơn. Màn hình Màn hình hiển thị có thể được gắn liền với chiếc máy tính của bạn hoặc có thể là một màn hình riêng biệt với dây nguồn riêng. Một số loại màn hình còn được trang bị tính năng cảm ứng rất tiện lợi và hiện đại. Chất lượng của màn hình được đánh giá qua độ phân giải. Thông số này càng cao thì chất lượng hình ảnh hiển thị càng tốt hơn, chân thực hơn.
Tìm hiểu về phần cứng máy tính để bạn sử dụng hiệu quả hơn Ổ đĩa quang Tất cả các máy tính từ máy tính xách tay cho đến máy tính để bàn đều đi kèm với một ổ đĩa quang. Đây là vị trí để đọc, ghi đĩa CD, DVD, và Blu-ray. Tuy nhiên trong sự phát triển của công nghệ, khi mà các dữ liệu, phim ảnh có thể lưu trữ trên internet thì ổ đĩa quang cũng sử dụng hạn chế hơn. Card mạng Card mạng được sử dụng trong việc kết nối internet. Đa số các máy tính hiện đại đều được tích hợp một card mạng LAN không dây hoặc có dây. Điều này giúp bạn có thể kết nối dễ dàng với bộ định tuyến internet. Nếu sử dụng card không dây, máy tính sẽ được kết nối đến bộ định tuyến thông qua wifi. Nếu sử dụng card có dây, bạn kết nối cáp mạng từ máy tính đến bộ định tuyến. Thiết bị đầu vào Thiết bị đầu vào của máy tính là việc tập hợp các yếu tố để đưa vào hệ thống xử lý. Dữ liệu thông tin đầu vào gồm 2 loại: Tự nhiên và có cấu trúc Trên đây, Máy Tính Trạm đã chia sẻ đến bạn các thông tin về phần cứng máy tính là gì và tìm hiểu về phần cứng máy tính. Khi nắm được các thông tin này sẽ rất hữu ích cho các bạn trong quá trình sử dụng và học tập sau này. Máy tính là một thiết bị điện tử quan trọng và cần thiết hỗ trợ bạn rất nhiều trong cả học tập, làm việc lẫn nhu câu giải trí, vì thế hiểu rõ về nó sẽ giúp bạn có được những trải nghiệm tốt hơn. Để tìm hiểu nhiều hơn những thông tin về máy tính cũng như kinh nghiệm trong sử dụng máy tính bạn có thể đến ngay cửa hàng Máy Tính Trạm để nhận sự tư vấn từ kỹ thuật viên. Chúng tôi luôn sẵn sàng hỗ trợ bạn nhanh chóng nhất. Nguồn: Maytinhtram.vn
Để xây dựng các hệ thống có hiệu năng cao, ta cần nắm chắc kiến thức về các thuật toán và mô hình để có thể biểu diễn được những khía cạnh thống kê của bài toán. Đồng thời, ta cũng cần có một chút kiến thức cơ bản về phần cứng thực thi ở bên dưới. Nội dung trong phần này không thể thay thế một khóa học đầy đủ về phần cứng và thiết kế hệ thống, mà sẽ chỉ đóng vai trò như điểm bắt đầu để giúp người đọc hiểu tại sao một số thuật toán lại hiệu quả hơn các thuật toán khác và làm thế nào để đạt được thông lượng cao. Thiết kế tốt có thể dễ dàng tạo ra sự khác biệt rất lớn, giữa việc có thể huấn luyện một mô hình (ví dụ trong khoảng một tuần) và không thể huấn luyện (ví dụ mất 3 tháng để huấn luyện xong, từ đó không kịp tiến độ). Ta sẽ bắt đầu bằng việc quan sát tổng thể một hệ thống máy tính. Tiếp theo, ta sẽ đi sâu hơn và xem xét chi tiết về CPU và GPU. Cuối cùng, ta sẽ tìm hiểu cách các máy tính được kết nối với nhau trong trạm máy chủ hay trên đám mây. Cần lưu ý, phần này sẽ không hướng dẫn cách lựa chọn card GPU. Nếu bạn cần gợi ý, hãy xem Section 19.5. Phần giới thiệu về điện toán đám mây trên AWS có thể tìm thấy tại Section 19.3. Bạn đọc có thể tham khảo nhanh thông tin tóm tắt trong Fig. 12.4.1. Nội dung này được trích dẫn từ bài viết của Colin Scott trình bày tổng quan về những tiến bộ trong thập kỉ qua. Số liệu gốc được trích dẫn từ buổi thảo luận của Jeff Dean tại trường Stanford năm 2010. Phần thảo luận dưới đây sẽ giải thích cơ sở cho những con số trên và cách mà chúng dẫn dắt ta trong quá trình thiết kế thuật toán. Nội dung khái quát và ngắn gọn nên nó không thể thay thế một khóa học đầy đủ, nhưng sẽ cung cấp đủ thông tin cho những người làm mô hình thống kê để có thể đưa ra lựa chọn thiết kế phù hợp. Để có cái nhìn tổng quan chuyên sâu về kiến trúc máy tính, bạn đọc có thể tham khảo [Hennessy & Patterson, 2011] hay một khóa học gần đây của Arste Asanovic.
Hầu hết những nhà nghiên cứu học sâu đều được trang bị hệ thống máy tính có bộ nhớ và khả năng tính toán khá lớn với một hay nhiều GPU. Những máy tính này thường có những thành phần chính sau:
Hình Fig. 12.4.2 cho thấy, hầu hết các thành phần (mạng, GPU, ổ lưu trữ) được kết nối tới GPU thông qua đường bus PCI mở rộng. Đường truyền này gồm nhiều làn kết nối trực tiếp tới CPU. Ví dụ, Threadripper 3 của AMD có 64 làn PCIe 4.0, mỗi làn có khả năng truyền dẫn 16 Gbit/s dữ liệu theo cả hai chiều. Bộ nhớ được kết nối trực tiếp tới CPU với tổng băng thông lên đến 100 GB/s. Khi ta chạy chương trình trên máy tính, ta cần trộn dữ liệu ở các bộ xử lý (CPU hay GPU), thực hiện tính toán và sau đó truyền kết quả tới RAM hay ổ lưu trữ. Do đó, để có hiệu năng tốt, ta cần đảm bảo rằng chương trình chạy mượt mà và hệ thống không có nút nghẽn cổ chai. Ví dụ, nếu ta không thể tải ảnh đủ nhanh, bộ xử lý sẽ không có có dữ liệu để chạy. Tương tự, nếu ta không thể truyền các ma trận tới CPU (hay GPU) đủ nhanh, bộ xử lý sẽ thiếu dữ liệu để hoạt động. Cuối cùng, nếu ta muốn đồng bộ nhiều máy tính trong một mạng, kết nối mạng không nên làm chậm việc tính toán. Xen kẽ việc giao tiếp và tính toán giữa các máy tính là một phương án cho vấn đề này. Giờ hãy xem xét các thành phần trên một cách chi tiết hơn.
Về cơ bản, bộ nhớ được sử dụng để lưu trữ dữ liệu khi cần sẵn sàng truy cập. Hiện tại bộ nhớ RAM của CPU thường thuộc loại DDR4, trong đó mỗi mô-đun có băng thông 20-25GB/s và độ rộng bus 64 bit. Thông thường, các cặp mô-đun bộ nhớ cho phép sử dụng đa kênh. CPU có từ 2 đến 4 kênh bộ nhớ, nghĩa là chúng có băng thông bộ nhớ tối đa từ 40 GB/s đến 100 GB/s. Thường thì mỗi kênh có hai dải (bank). Ví dụ, Zen 3 Threadripper của AMD có 8 khe cắm. Dù những con số trên trông khá ấn tượng, trên thực tế chúng chỉ nói lên một phần nào đó. Khi muốn đọc một phần nào đó từ bộ nhớ, trước tiên ta cần chỉ cho mô-đun bộ nhớ vị trí chứa thông tin, tức cần gửi địa chỉ đến RAM. Khi thực hiện xong việc này, ta có thể chọn chỉ đọc một bản ghi 64 bit hoặc một chuỗi dài các bản ghi. Lựa chọn thứ hai được gọi là đọc nhanh (burst read). Nói ngắn gọn, việc gửi một địa chỉ vào bộ nhớ và thiết lập chuyển tiếp sẽ mất khoảng 100ns (thời gian cụ thể phụ thuộc vào hệ số thời gian của từng chip bộ nhớ được sử dụng), mỗi lần chuyển tiếp sau đó chỉ mất 0.2ns. Có thể thấy lần đọc đầu tiên tốn thời gian gấp 500 lần những lần sau! Ta có thể đọc ngẫu nhiên tối đa \(10,000,000\) lần mỗi giây. Điều này cho thấy rằng ta nên hạn chế tối đa việc truy cập bộ nhớ ngẫu nhiên và thay vào đó nên sử dụng cách đọc (và ghi) nhanh (burst read, và burst write). Mọi thứ trở nên phức tạp hơn một chút khi ta tính đến việc có nhiều dải bộ nhớ. Mỗi dải có thể đọc bộ nhớ gần như là độc lập với nhau. Điều này có hai ý sau. Thứ nhất, số lần đọc ngẫu nhiên thực sự cao hơn tới 4 lần, miễn là chúng được trải đều trên bộ nhớ. Điều đó cũng có nghĩa là việc thực hiện các lệnh đọc ngẫu nhiên vẫn không phải là một ý hay vì các lệnh đọc nhanh (burst read) cũng nhanh hơn gấp 4 lần. Thứ hai, do việc căn chỉnh bộ nhớ theo biên 64 bit, ta nên căn chỉnh mọi cấu trúc dữ liệu theo cùng biên đó. Trình biên dịch thực hiện việc này một cách tự động khi các cờ thích hợp được đặt. Độc giả có thể tham khảo thêm bài giảng về DRAM ví dụ như Zeshan Chishti. Bộ nhớ GPU còn yêu cầu băng thông cao hơn nữa vì chúng có nhiều phần tử xử lý hơn CPU. Nhìn chung có hai phương án tiếp cận đối với vấn đề này. Một cách là mở rộng bus bộ nhớ. Chẳng hạn NVIDIA’s RTX 2080 Ti dùng bus có kích thước 352 bit. Điều này cho phép truyền đi lượng thông tin lớn hơn cùng lúc. Một cách khác là sử dụng loại bộ nhớ chuyên biệt có hiệu năng cao cho GPU. Các thiết bị hạng phổ thông, điển hình như dòng RTX và Titan của NVIDIA, dùng các chip GDDR6 với băng thông tổng hợp hơn 500 GB/s. Một loại bộ nhớ chuyên biệt khác là mô-đun HBM (bộ nhớ băng thông rộng). Chúng dùng phương thức giao tiếp rất khác và kết nối trực tiếp với GPU trên một tấm bán dẫn silic chuyên biệt. Điều này dẫn đến giá thành rất cao và chúng chỉ được sử dụng chủ yếu cho các chip máy chủ cao cấp, ví dụ như dòng GPU NVIDIA Volta V100. Không quá ngạc nhiên, kích thước bộ nhớ GPU nhỏ hơn nhiều so với bộ nhớ CPU do giá thành cao của nó. Nhìn chung các đặc tính hiệu năng của bộ nhớ GPU khá giống bộ nhớ CPU, nhưng nhanh hơn nhiều. Ta có thể bỏ qua các chi tiết sâu hơn trong cuốn sách này, do chúng chỉ quan trọng khi cần điều chỉnh các hạt nhân GPU để đạt thông lượng xử lý cao hơn.
Chúng ta đã thấy đặc tính then chốt của RAM chính là băng thông và độ trễ. Điều này cũng đúng đối với các thiết bị lưu trữ, sự khác biệt chỉ có thể là các đặc tính trên lớn hơn nhiều lần. Các ổ cứng đã được sử dụng hơn nửa thế kỷ. Một cách ngắn gọn, chúng chứa một số đĩa quay với những đầu kim có thể di chuyển để đọc/ghi ở bất cứ rãnh nào. Các ổ đĩa cao cấp có thể lưu trữ lên tới 16 TB trên 9 đĩa. Một trong những lợi ích chính của ổ đĩa cứng là chúng tương đối rẻ. Nhược điểm của chúng là độ trễ tương đối cao khi đọc dữ liệu và hay bị hư hỏng nặng dẫn đến không thể đọc dữ liệu, thậm chí là mất dữ liệu. Để hiểu về nhược điểm thứ hai, hãy xem xét thực tế rằng ổ cứng quay với tốc độ khoảng 7,200 vòng/phút. Nếu tốc độ này cao hơn, các đĩa sẽ vỡ tan do tác dụng của lực ly tâm. Điều này dẫn đến một nhược điểm lớn khi truy cập vào một khu vực cụ thể trên đĩa: chúng ta cần đợi cho đến khi đĩa quay đúng vị trí (chúng ta có thể di chuyển đầu kim nhưng không được tăng tốc các đĩa). Do đó, có thể mất hơn 8ms cho đến khi truy cập được dữ liệu yêu cầu. Vì thế mà ta hay nói ổ cứng có thể hoạt động ở mức xấp xỉ 100 IOP. Con số này về cơ bản vẫn không thay đổi trong hai thập kỷ qua. Tệ hơn nữa, việc tăng băng thông cũng khó khăn không kém (ở mức độ 100-200 MB/s). Rốt cuộc, mỗi đầu đọc một rãnh bit, do đó tốc độ bit chỉ tăng theo tỷ lệ căn bậc hai của mật độ thông tin. Kết quả là các ổ cứng đang nhanh chóng biến thành nơi lưu trữ cấp thấp cho các bộ dữ liệu rất lớn. Ổ cứng thể rắn (SSD) sử dụng bộ nhớ Flash để liên tục lưu trữ thông tin. Điều này cho phép truy cập nhanh hơn nhiều vào các bản ghi đã được lưu trữ. SSD hiện đại có thể hoạt động ở mức 100,000 đến 500,000 IOP, tức là nhanh hơn gấp 1000 lần so với ổ cứng HDD. Hơn nữa, băng thông của chúng có thể đạt tới 1-3GB/s nghĩa là nhanh hơn 10 lần so với ổ cứng. Những cải tiến này nghe có vẻ tốt đến mức khó tin. Thật vậy, và SSD cũng đi kèm với một số hạn chế do cách mà chúng được thiết kế.
Lưu trữ đám mây cung cấp nhiều lựa chọn hiệu suất có thể tùy chỉnh. Nghĩa là, việc chỉ định bộ lưu trữ cho các máy ảo là tùy chỉnh, cả về số lượng và tốc độ, do người dùng quyết định. Chúng tôi khuyên người dùng nên tăng số lượng IOP được cung cấp bất cứ khi nào độ trễ quá cao, ví dụ như trong quá trình huấn luyện với dữ liệu gồm nhiều bản ghi nhỏ.
Bộ xử lý trung tâm (Central Processing Units - CPU) là trung tâm của mọi máy tính (như ở phần trước, chúng tôi đã mô tả tổng quan về những phần cứng quan trọng cho các mô hình học sâu hiệu quả). CPU gồm một số thành tố quan trọng: lõi xử lý (core) với khả năng thực thi mã máy, bus kết nối các lõi (cấu trúc kết nối cụ thể có sự khác biệt lớn giữa các mô hình xử lý, đời chip và nhà sản xuất) và bộ nhớ đệm (cache) cho phép truy cập với băng thông cao hơn và độ trễ thấp hơn so với việc đọc từ bộ nhớ chính. Cuối cùng, hầu hết CPU hiện đại chứa những đơn vị xử lý vector để hỗ trợ tính toán đại số tuyến tính và tích chập với tốc độ cao vì chúng khá phổ biến trong xử lý phương tiện và học máy.
Fig. 12.4.3 minh hoạ bộ xử lý Intel Skylake với CPU lõi tứ. Nó có một GPU tích hợp, bộ nhớ cache và phương tiện kết nối bốn lõi. Thiết bị ngoại vi (Ethernet, WiFi, Bluetooth, bộ điều khiển SSD, USB, v.v.) là một phần của chipset hoặc được đính kèm trực tiếp (PCIe) với CPU.
Mỗi nhân xử lý bao gồm các thành phần rất tinh vi. Mặc dù chi tiết khác nhau giữa đời chip và nhà sản xuất, chức năng cơ bản của chúng đã được chuẩn hóa tương đối. Front-end tải các lệnh và dự đoán nhánh nào sẽ được thực hiện (ví dụ: cho luồng điều khiển). Sau đó các lệnh được giải mã từ mã nguồn hợp ngữ (assembly code) thành vi lệnh. Mã nguồn hợp ngữ thường chưa phải là mã nguồn cấp thấp nhất mà bộ xử lý thực thi. Thay vào đó, các lệnh phức tạp có thể được giải mã thành một tập hợp các phép tính cấp thấp hơn. Tiếp đó chúng được xử lý bằng một lõi thực thi. Các bộ xử lý đời mới thường có khả năng thực hiện đồng thời nhiều câu lệnh. Ví dụ, lõi ARM Cortex A77 trong Fig. 12.4.4 có thể thực hiện lên đến 8 phép tính cùng một lúc.
Điều này có nghĩa là các chương trình hiệu quả có thể thực hiện nhiều hơn một lệnh trên một chu kỳ xung nhịp, giả sử rằng chúng có thể được thực hiện một cách độc lập. Không phải tất cả các bộ xử lý đều được tạo ra như nhau. Một số được thiết kế chuyên biệt cho các lệnh về số nguyên, trong khi một số khác được tối ưu hóa cho việc tính toán số thực dấu phẩy động. Để tăng thông lượng, bộ xử lý cũng có thể theo đồng thời nhiều nhánh trong một lệnh rẽ nhánh và sau đó loại bỏ các kết quả của nhánh không được thực hiện. Đây là lý do vì sao đơn vị dự đoán nhánh có vai trò quan trọng (trên front-end), bởi chúng chỉ chọn những nhánh có khả năng cao được rẽ.
Học sâu đòi hỏi sức mạnh tính toán cực kỳ lớn. Vì vậy, CPU phù hợp với học máy cần phải thực hiện được nhiều thao tác trong một chu kỳ xung nhịp. Ta có thể đạt được điều này thông qua các đơn vị vector. Trên chip ARM chúng được gọi là NEON, trên x86 thế hệ đơn vị vector mới nhất được gọi là AVX2. Một khía cạnh chung là chúng có thể thực hiện SIMD (đơn lệnh đa dữ liệu - single instruction multiple data). Fig. 12.4.5 cho thấy cách cộng 8 số nguyên ngắn trong một chu kỳ xung nhịp trên ARM.
Phụ thuộc vào các lựa chọn kiến trúc, các thanh ghi như vậy có thể dài tới 512 bit, cho phép tổ hợp tối đa 64 cặp số. Chẳng hạn, ta có thể nhân hai số và cộng chúng với số thứ ba, cách này còn được biết đến như phép nhân-cộng hợp nhất (fused multiply-add). OpenVino của Intel sử dụng thao tác này để đạt được thông lượng đáng nể cho học sâu trên CPU máy chủ. Tuy nhiên, xin lưu ý rằng tốc độ này hoàn toàn không đáng kể so với khả năng của GPU. Ví dụ, RTX 2080 Ti của NVIDIA có 4,352 nhân CUDA, mỗi nhân có khả năng xử lý một phép tính như vậy tại bất cứ thời điểm nào.
Xét tình huống sau: ta có một CPU bình thường với 4 nhân như trong Fig. 12.4.3 trên, hoạt động ở tần số 2 GHz. Thêm nữa, hãy giả sử IPC (instruction per clock - số lệnh mỗi xung nhịp) là 1 và mỗi nhân đều đã kích hoạt AVX2 rộng 256 bit. Ngoài ra, giả sử bộ nhớ cần truy cập ít nhất một thanh ghi được sử dụng trong các lệnh AVX2. Điều này có nghĩa CPU xử lý 4 x 256 bit = 1 kbit dữ liệu mỗi chu kỳ xung nhịp. Trừ khi ta có thể truyền \(2 \cdot 10^9 \cdot 128 = 256 \cdot 10^9\) byte đến vi xử lý mỗi giây, các nhân sẽ thiếu dữ liệu để xử lý. Tiếc thay giao diện bộ nhớ của bộ vi xử lý như trên chỉ hỗ trợ tốc độ truyền dữ liệu khoảng 20-40 GB/s, nghĩa là thấp hơn 10 lần. Để khắc phục vấn đề này, ta cần tránh nạp dữ liệu mới từ bộ nhớ ngoài, và tốt hơn hết là lưu trong bộ nhớ cục bộ trên CPU. Đây chính là lúc bộ nhớ đệm trở nên hữu ích (xem bài viết trên Wikipedia này để bắt đầu). Một số tên gọi/khái niệm thường gặp:
Việc dự đoán phần tử bộ nhớ nào sẽ cần tiếp theo là một trong những tham số tối ưu chính trong thiết kế vi xử lý. Ví dụ, việc duyệt xuôi bộ nhớ được coi là thích hợp do đa số các thuật toán ghi đệm (caching algorithms) sẽ cố gắng đọc về trước hơn là về sau. Tương tự, việc giữ hành vi truy cập bộ nhớ ở mức cục bộ là một cách tốt để cải thiện hiệu năng. Tăng số lượng bộ nhớ đệm là một con dao hai lưỡi. Một mặt việc này đảm bảo các nhân vi xử lý không bị thiếu dữ liệu. Mặt khác nó tăng kích thước vi xử lý, lấn chiếm phần diện tích mà đáng ra có thể được sử dụng vào việc tăng khả năng xử lý. Xét trường hợp tệ nhất như mô tả trong Fig. 12.4.6. Một địa chỉ bộ nhớ được lưu trữ tại vi xử lý 0 trong khi một luồng của vi xử lý 1 yêu cầu dữ liệu đó. Để có thể lấy dữ liệu, vi xử lý 0 phải dừng công việc đang thực hiện, ghi lại thông tin vào bộ nhớ chính để vi xử lý 1 đọc dữ liệu từ đó. Trong suốt quá trình này, cả hai vi xử lý đều ở trong trạng thái chờ. Một đoạn mã như vậy khả năng cao là sẽ chạy chậm hơn trên một hệ đa vi xử lý so với một vi xử lý đơn được lập trình hiệu quả. Đây là một lý do nữa cho việc tại sao thực tế phải giới hạn kích thước bộ nhớ đệm (ngoài việc chiếm diện tích vật lý).
Không hề phóng đại khi nói rằng học sâu có lẽ sẽ không thành công nếu không có GPU. Và cũng nhờ có học sâu mà tài sản của các công ty sản suất GPU tăng trưởng đáng kể. Sự đồng tiến hóa giữa phần cứng và các thuật toán dẫn tới tình huống mà học sâu trở thành mẫu mô hình thống kê được ưa thích bất kể có hiệu quả hay không. Do đó, ta cần phải hiểu rõ ràng lợi ích mà GPU và các thiết bị tăng tốc khác như TPU [Jouppi et al., 2017] mang lại. Ta cần chú ý đến đặc thù thường được sử dụng trong thực tế: thiết bị tăng tốc được tối ưu hoặc cho bước huấn luyện hoặc cho bước suy luận. Đối với bước suy luận, ta chỉ cần tính toán lượt truyền xuôi qua mạng, không cần sử dụng bộ nhớ để lưu dữ liệu trung gian ở bước lan truyền ngược. Hơn nữa, ta có thể không cần đến phép tính quá chính xác (thường thì FP16 hoặc INT8 là đủ) Mặt khác trong quá trình huấn luyện, tất cả kết quả trung gian đều cần phải lưu lại để tính gradient. Hơn nữa, việc tích luỹ gradient yêu cầu độ chính xác cao hơn nhằm tránh lỗi tràn số trên hoặc dưới, do đó bước huấn luyện yêu cầu tối thiểu độ chính xác FP16 (hoặc độ chính xác hỗn hợp khi kết hợp với FP32). Tất cả các yếu tố trên đòi hỏi bộ nhớ nhanh hơn và lớn hơn (HBM2 hoặc GDDR6) và nhiều khả năng xử lý hơn. Ví dụ, GPU Turing T4 của NVIDIA được tối ưu cho bước suy luận trong khi GPU V100 phù hợp cho quá trình huấn luyện. Xem lại Fig. 12.4.5. Việc thêm các đơn vị vector vào lõi vi xử lý cho phép ta tăng đáng kể thông lượng xử lý (ở ví dụ trong hình ta có thể thực hiện 16 thao tác cùng lúc). Chuyện gì sẽ xảy ra nếu ta không chỉ tối ưu cho phép tính giữa các vector mà còn tối ưu cho các ma trận? Chiến lược này dẫn tới sự ra đời của Lõi Tensor (chi tiết sẽ được thảo luận sau đây). Thứ hai, nếu tăng số lượng lõi thì sao? Nói tóm lại, hai chiến lược trên tóm tắt việc quyết định thiết kế của GPU. Fig. 12.4.7 mô tả tổng quan một khối xử lý đơn giản, bao gồm 16 đơn vị số nguyên và 16 đơn vị dấu phẩy động. Thêm vào đó, hai Lõi Tensor xử lý một tập nhỏ các thao thác liên quan đến học sâu được thêm vào. Mỗi Hệ vi xử lý Luồng (Streaming Multiprocessor - SM) bao gồm bốn khối như vậy.
12 hệ vi xử lý luồng sau đó được nhóm vào một cụm xử lý đồ hoạ tạo nên vi xử lý cao cấp TU102. Số lượng kênh bộ nhớ phong phú và bộ nhớ đệm L2 được bổ sung vào cấu trúc. Thông tin chi tiết được mô tả trong Fig. 12.4.8. Một trong những lý do để thiết kế một thiết bị như vậy là từng khối riêng biệt có thể được thêm vào hoặc bỏ đi tuỳ theo nhu cầu để có thể tạo thành một vi xử lý nhỏ gọn và giải quyết một số vấn đề phát sinh (các mô-đun lỗi có thể không được kích hoạt). May mắn thay, các nhà nghiên cứu học sâu bình thường không cần lập trình cho các thiết bị này do đã có các lớp mã nguồn framework CUDA ở tầng thấp. Cụ thể, có thể có nhiều hơn một chương trình được thực thi đồng thời trên GPU, với điều kiện là còn đủ tài nguyên. Tuy nhiên ta cũng cần để ý đến giới hạn của các thiết bị nhằm tránh việc lựa chọn mô hình quá lớn so với bộ nhớ của thiết bị.
Khía cạnh cuối cùng đáng để bàn luận chi tiết là Lõi Tensor (TensorCore). Đây là một ví dụ của xu hướng gần đây là sử dụng thêm nhiều mạch đã được tối ưu để tăng hiệu năng cho học sâu. Ví dụ, TPU có thêm một mảng tâm thu (systolic array) [Kung, 1988] để tăng tốc độ nhân ma trận. Thiết kế của TPU chỉ hỗ trợ một số lượng rất ít các phép tính kích thước lớn (thế hệ TPU đầu tiên hỗ trợ một phép tính). Lõi Tensor thì ngược lại, được tối ưu cho các phép tính kích thước nhỏ cho các ma trận kích thước 4x4 đến 16x16, tuỳ vào độ chính xác số học. Fig. 12.4.9 mô tả tổng quan quá trình tối ưu.
Đương nhiên khi tối ưu cho quá trình tính toán, ta buộc phải có một số đánh đổi nhất định. Một trong số đó là GPU không xử lý tốt dữ liệu ngắt quãng hoặc thưa. Trừ một số ngoại lệ đáng chú ý, ví dụ như Gunrock [Wang et al., 2016], việc truy cập vector và ma trận thưa không phù hợp với các thao tác đọc theo cụm (burst read) với băng thông cao của GPU. Đạt được cả hai mục tiêu là một lĩnh vực đang được đẩy mạnh nghiên cứu. Ví dụ, tham khảo DGL, một thư viện được điều chỉnh cho phù hợp với học sâu trên đồ thị.
Mỗi khi một thiết bị đơn không đủ cho quá trình tối ưu, ta cần chuyển dữ liệu đến và đi khỏi nó để đồng bộ hóa quá trình xử lý. Đây chính là lúc mà mạng máy tính và bus trở nên hữu dụng. Ta có một vài tham số thiết kế gồm: băng thông, chi phí, khoảng cách và tính linh hoạt. Tuy ta cũng có Wifi với phạm vi hoạt động tốt, dễ dàng để sử dụng (dù sao cũng là không dây), rẻ nhưng lại có băng thông không quá tốt và độ trễ lớn. Sẽ không có bất cứ nhà nghiên cứu học máy tỉnh táo nào lại nghĩ đến việc sử dụng Wifi để xây dựng một cụm máy chủ. Sau đây, ta sẽ chỉ tập trung vào các cách kết nối phù hợp cho học sâu.
Các thông tin trong table_latency_numbers và table_latency_numbers_tesla được Eliot Eshelman duy trì cập nhật trên GitHub Gist. :Các độ trễ thường gặp.
:Độ trễ của GPU NVIDIA Tesla.
Bản dịch trong trang này được thực hiện bởi:
|