2024/12/30

☕ Nhàn đàm ICT: 12 days of Shipmas by OpenAI 🎄

Phác họa bài post:

. Đề dẫn.

. 12 days of Shipmas

. Suy ngẫm chậm.

~

Để giúp anh/chị quyết định có đọc tiếp hay không, tôi xin phép cung cấp các thông tin liên quan đến bài post này như sau:

·       Chủ đề: Machine Learning

·       Tính thời sự: tháng 12/2024

·       Thời gian đọc: 10 phút đọc bài post (nếu xem toàn bộ 12 video thì mất khoảng 3 tiếng đồng hồ)

. Đề dẫn.

Trong văn hóa người Anh, vào dịp Giáng sinh có bài hát với tựa đề “The Twelve Days of Christmas” (tạm dịch: 12 ngày Giáng sinh). Trong bài hát, mỗi một ngày, “”ca sỹ” được “người yêu” tặng một món quà. Năm nay, trong chiến dịch quảng bá sản phẩm, công ty OpenAI đã “nhại” tiêu đề bài hát này thành “12 days of Shipmas”. Tiêu đề này có ý chơi chữ biến “Christmas” thành “Shipmas” – về mặt phát âm nghe từa tựa như nhau. Từ “Ship” có nghĩa là “Giao/Giao hàng”, “mas” là hậu tố của “Christmas”. Vì các loại “hàng” trong dịp Giáng sinh phần lớn là quà, nên tôi tạm dịch tiêu đề đó thành “12 ngày giao quà Giáng sinh”. Và quả thật đúng thế. Bắt đầu từ ngày 5/12/2024, mỗi một ngày trong tuần (từ thứ Hai đến thứ Sáu) OpenAI đã “giao” cho công chúng một món quà “AI”. Mời anh/chị cùng tôi điểm lại “12 days of Shipmas”.

-

.12 days of Shipmas.

Day 1: Thứ Năm ngày 5/12/2024

Video: o1 & ChatGPT Pro

Trong ngày đầu tiên, OpenAI giới thiệu phiên bản đầy đủ o1 – mô hình được cho là có khả năng lập luận (cho các thuê bao ChatGPT Plus & Team). Ngoài văn bản, mô hình o1 còn có “thị giác”, có khả năng phân tích và “hiểu” một cách chi tiết các bức ảnh. O1 có thời gian suy nghĩ nhanh hơn o1-preview (ra mắt hồi tháng 9/2024) và mắc ít lỗi hơn.

Ngoài ra, họ còn giới thiệu loại thuê bao mới có tên là ChatGPT Pro, giá thuê bao là 200$/tháng. Giá này cao gấp 10 lần thuê bao ChatGPT Plus là 20$/tháng. ChatGPT Pro có thể truy cập và sử dụng không giới hạn các mô hình o1, GPT-4o và có chế độ “Advanced Voice”: nghe hiểu.

Day 2: Thứ Sáu ngày 6/12/2024

Video: OpenAI's Reinforcement Fine-Tuning Research Program

Ngày 2 có vẻ hơi nặng về kỹ thuật. Họ giới thiệu một phương pháp tinh chỉnh mới có tên là Reinforcement Fine-Tuning (RFT). Chúng ta đã quen với kỹ thuật tinh chỉnh có giám sát: Supervised Fine-Tuning (SFT). RFT được cho là vượt trội SFT. Đại ý của RFT: cho một bài toán, mô hình đi tìm tất cả các lời giải, sắp xếp chúng theo thứ tự: [tốt nhất, tốt nhì, …]. Dãy thứ tự lời giải này sau đó được so với đáp án trên thực tế và được chấm điểm (grader). Bằng phương pháp tinh chỉnh này người dùng có thể tăng cường năng lực lý luận của mô hình.

Video cho biết ông Justin Reese đến từ Berkeley Lab đã thử nghiệm RFT để nghiên cứu các bệnh di truyền hiếm gặp, trong khi Thomson Reuters đã tạo ra một mô hình o1-mini chuyên biệt cho trợ lý ảo về pháp lý CoCounsel AI.

Lúc đầu OpenAI dự định cho ra mắt RFT vào đầu năm 2024 nhưng cho đến thời điểm này họ chỉ cho tiếp cận một cách hạn chế.

Day 3: Thứ Hai ngày 9/12/2024

Video: Sora

Ngày 3, OpenAI giới thiệu mô hình Sora: text-to-video (dành cho thuê bao ChatGPT plus và ChatGPT Pro qua một website riêng là sora.com). Về đại thể: đầu vào của Sora là một đoạn văn bản và đầu ra là một đoạn video clip. Trên thực tế, người dùng phải điều chỉnh nhiều tham số, sau đó Sora mới cho ra được đoạn video clip.

Sora được giới thiệu lần đầu (preview) vào tháng 2/2024. OpenAI hạn chế các video được tạo ra có yếu tố con người vì sợ bị lạm dụng. Thuê bao ChatGPT Plus (20$/tháng) có thể tạo 50 video/tháng, với độ phân giải chủ yếu là 480p (852×480 pixels), số lượng video được phép tạo ra ít hơn nếu dùng độ phân giải 720p (1280x720 pixels). Thuê bao ChatGPT Pro (200$/tháng) có thể tạo video có độ phân giải cao hơn với thời lượng dài hơn (max 20 giây).

Day 4: Thứ Ba ngày 10/12/2024

Video: Canvas

Ngày 4, OpenAI chuyển phiên bản beta Canvas (giới thiệu hồi tháng 10/2024) sang phiên bản chính thức cho toàn bộ người dùng ChatGPT, kể cả người dùng miễn phí. Nghĩa gốc của từ Canvas là khung vẽ cho họa sỹ. Trong ngữ cảnh kỹ thuật số, chúng ta có thể hiểu Canvas là “vùng bản thảo”. Canvas giúp người dùng soạn thảo bài viết hoặc lập trình.

Khi soạn thảo bài viết, Canvas có các chức năng cơ bản như in đậm, in nghiêng hoặc chọn Style (Heading 1, Heading 2, …) tương tự như khi chúng ta soạn thảo bằng phần mềm Word của Microsoft nhưng ở mức độ đơn giản hơn. Về nội dung bài viết, sau khi chúng ta đưa vào Canvas, Canvas sẽ tự động chuyển đổi nội dung thành một đoạn văn mới, vẫn giữ các ý chính. Nội dung được Canvas sửa đổi thường được sắp xếp một cách có cấu trúc phân cấp, lời văn trôi chảy hơn, …

Lập trình: Canvas cộng tác giúp chúng ta rà duyệt (review code), thêm phần lưu ký vết (logs) bằng cách thêm lệnh “print”, tự động thêm thuyết minh (comments), hỗ trợ gỡ rối (fix bugs), chuyển ngữ giữa các ngôn ngữ lập trình gồm JavaScript, TypeScript, Python, Java, C++ hoặc PHP. Xem thêm: Introducing canvas.

Day 5: Thứ Tư ngày 11/12/2024

Video: ChatGPT in Apple Intelligence

Ngày 5, OpenAI thông báo là ChatGPT được tích hợp vào Apple Intelligence cho các máy iPhone, iPad và Mac đời mới gần đây. Không phải máy nào hoặc hệ điều hành (HĐH) nào của Apple cũng cài được ChatGPT:

·       iPhone: iPhone 8 trở lên; HĐH iOS 16.1 trở lên.

·       iPad: HĐH iPadOS 16.4 trở lên.

·       Mac: HĐH Mac 14 trở lên; Chỉ áp dụng cho máy Apple Silicon (M1, M2, M3) – Nghĩa là máy Mac được sản xuất bằng chip Intel sẽ không cài được (😊).

Trong video, chúng ta thấy OpenAI demo bằng cách hỏi Siri. Khi Siri thấy vấn đề “phức tạp” thì Siri “nhờ” ChatGPT giải quyết. Khi ChatGPT được kích hoạt thì máy lúc đó có các tính năng của ChatGPT. Trong demo, chúng ta thấy máy iPhone sử dụng camera để quay một đoạn video ngắn, nhận dạng được video và có thể lập trình theo yêu cầu.

Day 6: Thứ Năm ngày 12/12/2024

Video: Advanced voice with video & Santa mode

Ngày 6, OpenAI đưa thêm 2 tính năng mới liên quan đến chế độ Advanced Voice (nghe hiểu): đó là chế độ “video calling” (gọi video) và giọng nói của Ông già Noel (Santa Claus).

Video calling: người dùng sử dụng điện thoại, bật chế độ video, sau đó vừa “quay phim” vừa hội thoại với ChatGPT. Trong bản demo, ChatGPT có thể ghi nhớ các khung cảnh khi quay phim, có thể nhận dạng ảnh khi hội thoại cùng người dùng. Chế độ “video calling” chỉ có ở thuê bao ChatGPT Plus và ChatGPT Pro.

Giọng nói của Ông già Noel: Trong khoảng thời gian nghỉ lễ Giáng sinh (năm 2024), OpenAI cho xuất hiện một biểu tượng cạnh Advanced Voice là bông tuyết - tượng trưng cho Ông già Noel. Người dùng có thể hội thoại với Ông già Noel khi kích chuột vào bông tuyết này.

Day 7: Thứ Sáu ngày 13/12/2024

Video: Projects in ChatGPT

Ngày 7, OpenAI giới thiệu chức năng Projects. Projects cho phép người dùng sắp xếp các cuộc hội thoại và các file thành từng “ngăn” (folder) cho gọn gàng, ngăn nắp.

Chức năng Projects chỉ dành cho các thuê bao ChatGPT Plus, ChatGPT Team và ChatGPT Pro.

 

Day 8: Thứ Hai ngày 16/12/2024

Video: Search

Ngày 8, OpenAI giới thiệu chức năng Search (tìm kiếm). Kể từ ngày 16/12/2024, chức năng Search hoàn toàn miễn phí cho người dùng. Chúng ta có thể tìm kiếm bằng cách gõ văn bản hoặc dùng giọng nói. Khi dùng giọng nói (voice mode), phiên bản trên web có hạn mức sử dụng nên các thuê bao miễn phí có thể không nhìn thấy chế độ giọng nói. Chú ý rằng app ChatGPT (cài trên PC/Laptop/Mobile) có voice mode mặc dù bản trên Web có thể không có.

Day 9: Thứ Ba ngày 17/12/2024

Video: OpenAI o1 and new tools for developers

Ngày 9, OpenAI chính thức ra mắt mô hình o1 cho các nhà phát triển ứng dụng (application developers) gồm:

·       Chức năng API: function calling (gọi hàm ngoài), developer messages (chỉ định câu lệnh cho mô hình tuân theo), Structured Outputs (chỉ định dạng thức đầu ra), và vision capabilities (xử lý đầu vào là ảnh).

·       Cập nhật Realtime API: Hội thoại thời gian thực (với độ trễ thấp: low-latency).

·       Hỗ trợ chuẩn WebRTC: Hỗ trợ giao tiếp bằng chuẩn WebRTC (video, giọng nói).

·       Preference Fine-Tuning: Tinh chỉnh mô hình bằng so sánh trải nghiệm người dùng.

·       Giới thiệu SDK cho ngôn ngữ lập trình GoJava (phiên bản Beta).

Day 10: Thứ Tư ngày 18/12/2024

Video: 1-800-CHATGPT (1-800-242-8478)

Ngày 10, OpenAI giới thiệu cách gọi dịch vụ 1800 miễn phí ở Hoa Kỳ (số 1-800-242-8478). Trong demo, chúng thấy người dùng có thể gọi đến ChatGPT bằng smartphone, bằng một điện thoại di động loại cũ hoặc thậm chí bằng một điện thoại quay số. Khách quốc tế ngoài Hoa Kỳ có thể dùng Whatsapp (ứng dụng của Meta) để hội thoại bằng tin nhắn.

Day 11: Thứ Năm ngày 19/12/2024

Video: Work with apps

Ngày 11, OpenAI demo ChatGPT trên Desktop phối hợp với các app khác. Họ demo trên máy Mac (Apple) cách ChatGPT “cộng tác” với các app khác. Trong phần demo đầu, chúng ta thấy họ mở 2 app song song là Warp và ChatGPT trên Mac. Trong ChatGPT chúng ta nhìn thấy có 4 tùy chọn là Warp, Notion, Notes, Xcode. Khi người dùng chọn Warp thì lúc đó ChatGPT “nhìn thấy” tất cả các diễn biến của app này. Vì vậy, người dùng có thể đặt câu hỏi hoặc yêu cầu ChatGPT thực hiện các phép toán liên quan đến Warp. Như vậy, theo một nghĩa nào đó, ChatGPT đang tiến gần đến việc “điều khiển” các app trên máy để bàn! Tất nhiên, người dùng phải cấu hình để cho phép ChatGPT thực hiện việc đó.

Day 12: Thứ Sáu ngày 20/12/2024

Video: o3 preview & call for safety researchers

Ngày 12, OpenAI thông báo cho cộng đồng biết là mô hình tiếp theo o1 sẽ là o3. (Chú ý là họ nhảy một số, không có o2 vì o2 trùng tên với O2 – là công ty cung dịch vụ viễn thông của Anh.) Họ chưa cho ra mắt mô hình o3 vì họ còn phải kiểm thử độ an toàn của mô hình (safety test) – họ kêu gọi cộng đồng tham gia kiểm thử. Trong thông báo, họ cho biết đã test o3 với một số benchmark.

·       Về lập trình: o3 đạt 71.7% của benchmark SWE-bench Verified,

·       Về thi lập trình trên Codeforces o3 đạt Elo 2700 (nằm trong top 200 lập trình viên giỏi nhất thế giới),

·       Về giải toán AIME đạt 96.7%,

·       Về kiểm thử kiến thức sinh học, vật lý và hóa học GPQA Diamond o3 đạt 87.7%. Để so sánh: nghiên cứu sinh tiến sỹ đạt khoảng 70%.

Ngoài ra, o3 được test với 2 benchmark đặc biệt:

·       EpochAI: Đây là Benchmark về Toán cực khó, các nhà toán học phải mất nhiều giờ, thậm chí là nhiều ngày mới giải được. o3 đạt 25% trong lúc tất cả các mô hình khác chưa có mô hình nào vượt 2%.

·       ARC-AGI: Benchmark về lập luận dùng để đo độ AGI (Artificial General Intelligence – trí tuệ nhân tạo tổng quát). Khi kiểm thử, o3 đạt 87.5% trong lúc con người chỉ đạt khoảng 85%.

Cũng trong ngày 12, OpenAI đăng bài nghiên cứu với tựa đề “deliberative alignment” – tạm dịch là “điều chỉnh có cân nhắc”.

 

. Suy ngẫm chậm.

OpenAI đang đầu tư rất mạnh vào đa phương thức: ra mắt mô hình o1, phát triển Sora (tạo sinh “văn bản” → “video”), tương tác giọng nói với cuộc gọi video, … Các demo cho thấy họ hướng tới các mô hình có thể xử lý một cách liền mạch, giao thoa mềm mại giữa các phương thức văn bản, hình ảnh, giọng nói và video.

ChatGPT ra mắt ngày 30/11/2022, GPT-4 ra mắt tháng 3/2023, GPT-4o ra mắt tháng 5/2024, o1-preview tháng 9/2024, o1 tháng 12/2024. Thêm nữa: trong video của Day 12, OpenAI cho biết là o3-mini sẽ rat mắt cuối tháng 1/2025 và tiếp đó là o3. Họ liên tục cho ra mắt các mô hình mới với khả năng vượt trội, đa phương thức. Anh/chị có cảm nhận là AGI đang đến rất gần không?

Cái gây ấn tượng và có phần ngạc nhiên là khả năng lập luận (reasoning) của LLM. Theo tôi thì LLM bây giờ không còn đơn thuần chỉ là Autoregressive nữa. Tôi đoán mò chắc là họ kết hợp giữa Autoregressive với Reinforcement Learning (RL) & Agents. Các Agents “tỏa” đi tìm “lời giải” (bằng cách sử dụng thuật toán RL). Sau đó tại “đại bản doanh LLM”, “tổng chỉ huy” sẽ tập hợp các “lời giải”, sắp xếp các lời giải theo thứ tự “điểm số”, tìm điểm “tối ưu” và trả kết quả.

Đương nhiên, đã là đoán mò thì chẳng có giá trị “hàn lâm” gì, chỉ là làm cho cốc cà phê của anh/chị thêm phần “tasty”!

-

Trân trọng & vui nhã

(_/)
( •_•)
/ >

LeVanLoi

2024/12/20

☕ Nhàn đàm ICT: TPU (Tensor Processing Unit) ⦀

Phác họa bài post:

. Đề dẫn.

. Kiến trúc TPU.

. Systolic Array: trái tim của TPU.

. Trải nghiệm so sánh CPU, GPU, TPU.

. Suy ngẫm chậm.

. Phụ lục: Nội dung file “CPU, GPU, TPU comparison.ipynb”

~

Để giúp anh/chị quyết định có đọc tiếp hay không, tôi xin phép cung cấp các thông tin liên quan đến bài post này như sau:

·       Chủ đề: Parallel computing (điện toán song song), Electronics (Điện tử), Machine Learning

·       Tính thời sự: Tháng 5/2024.

·       Thời gian đọc: 11 phút, lồng vào thời gian uống cà phê (uống cà phê xong là đọc xong).

-

. Đề dẫn.

Tôi đã có dịp đàm luận cùng anh chị về GPU (Graphics Processing Unit), về việc sản xuất chip, về quy trình, các nội dung liên quan đến thiết kế chip. Lần này, chúng ta thử tò mò xem TPU (Tensor Processing Unit) được Google thiết kế, sản xuất rồi đưa vào vận hành như thế nào. Tôi cho rằng dân ICT là dân có bản tính tò mò, đặc biệt là tò mò về công nghệ.

Con đường dẫn đến TPU

Ngay từ năm 2006, Google đã tính đến chuyện làm ASIC (IC chuyên dụng), nhưng họ còn nấn ná chưa thực hiện. Đến năm 2013, khi họ định đưa giọng nói vào tìm kiếm (voice search) thì câu chuyện trở nên cấp bách. Họ tính rằng, nếu trung bình một người dùng một ngày thực hiện voice search trong 3 phút thì Google phải tăng gấp đôi số lượng trung tâm dữ liệu (data centers) của họ chỉ để khai thác các mô hình Machine Learning vào thời điểm lúc bấy giờ. Rõ ràng là cần tăng tốc độ xử lý các mô hình – vấn đề là cần tăng tốc ở khâu nào?

Bên lề

Tôi xin phép được “làm tươi” bộ nhớ của anh/chị về mô hình mạng nơ-ron (neural network). Để xây dựng mô hình, người ta tập hợp một lượng cực lớn dữ liệu (cỡ Giga, Tera bytes), làm sạch dữ liệu rồi huấn luyện (training) mô hình. Khi huấn luyện mô hình người ta điều chỉnh các trọng số (weights) sao cho đầu ra được tối ưu.

Sau khi đầu ra được cho là tối ưu, người ta dừng pha huấn luyện và đưa mô hình vào triển khai trong thực tế. Triển khai ứng dụng trong thực tế là như thế nào? Một cách giản lược, chúng ta hình dung như sau:

[Đầu vào] {Mô hình} [Đầu ra]

Lấy một ví dụ cho dễ hiểu: mô hình nhận dạng giọng nói. Để huấn luyện, người ta tập hợp hàng chục/trăm ngàn bản ghi dạng:

[âm thanh giọng nói → văn bản tương ứng],

[âm thanh giọng nói → văn bản tương ứng],

Sau khi huấn luyện thì khi chúng ta “nói một câu” (dạng âm thanh) thì mô hình cho ra một “đoạn văn bản”:

[Câu nói] {Mô hình} [đoạn văn bản]

❰/Bên lề

Pha huấn luyện thường kéo dài hàng tuần, thậm chí hàng tháng – người ta không đặt nặng vấn đề tốc độ xử lý với pha này. Chất lượng mô hình mới là vấn đề người ta quan tâm ở pha huấn luyện. Lấy ví dụ: mô hình nhận dạng giọng nói. Chất lượng mô hình là đạt được mức độ nhận dạng với sai sót rất thấp: ví dụ, dưới 1%. Tuy nhiên, khi khai thác mô hình (suy diễn: inference) thì tốc độ là cái người ta quan tâm hàng đầu. Ví dụ: tìm kiếm bằng giọng nói (voice search). Khi người dùng nói một câu thì engine tìm kiếm (search engine) phải nhận dạng gần như ngay tức thì (trong vòng vài giây đồng hồ), chuyển câu nói thành văn bản, rồi search engine dùng văn bản đó để tìm kiếm trên Internet. Không có chuyện sau khi nói xong phải mất mấy phút mới nhận dạng được giọng nói: người dùng sẽ bỏ đi, không quay lại dùng dịch vụ search engine đó nữa. Như vậy, khâu cần tăng tốc là khâu khai thác mô hình (inference).

 

Hình 1: Một mạng nơ-ron sau khi huấn luyện.


 

 

Giả thiết rằng sau khi huấn luyện, người ta được mạng nơ-ron như trong hình 1. Sang bước khai thác mô hình: cho vector đầu vào là X ([x1, x2, x3]) chúng ta phải tính vector đầu ra Y ([y1, y2]). Nghĩa là cho X mô hình suy ra Y.

[x1, x2, x3] {Inference} [y1, y2]

Mời anh/chị chúng ta cùng đi vào chi tiết một tẹo nhé:

·       Đầu vào: [x1, x2, x3]

·       Đầu ra: [y1, y2]

·       Hàm kích hoạt (activation) là hàm sigmoid

-

Thực chất Inferencefeedforward pass. Trong feedforward pass, các đầu vào sẽ được nhân với trọng số ở mỗi lớp để tạo ra đầu ra ở lớp tiếp theo. Vậy nên lớp h (lớp ẩn) được tính như sau:


(nhân ma trận: [x] * [w (trọng số)] = [h’])

Sau đó, ở lớp ẩn (lớp h), áp hàm kích hoạt thì được: 

-

Cuối cùng chúng ta áp phép nhân ma trận với tập trọng số, áp hàm kích hoạt để tính các nơ-ron đầu ra:



-

Tóm tắt: từ trái sang phải, không tính lớp đầu vào (x), cách tính giá trị mỗi lớp là:

[h/y] = factivation (nhân ma trận)

-

Có thể dễ dàng nhận thấy các phép toán của Inference là loạt các phép nhân ma trận và áp hàm kích hoạt (activation function). Số các phép nhân ma trận tùy thuộc vào mô hình có bao nhiêu lớp (layers). Các mô hình thông thường có từ vài chục đến vài trăm lớp, có khi đến hàng nghìn lớp. Tại mỗi lớp, số trọng số (weights) thường từ hàng triệu đến hàng chục triệu. Tổng hợp lại, có thể thấy lượng tính toán là khổng lồ.

Chú ý: Khi khai thác mô hình (Inference), các trọng số (weights) có giá trị cố định.

-

Kết luận: Khâu cần tăng tốc là Inference và trọng tâm của tăng tốc là nhân ma trận.

-

Nếu dùng thuật toán phần mềm để tăng tốc thì rất ít thứ có thể làm được. Vì vậy, bắt buộc họ phải nghĩ đến việc “cứng hóa” phép nhân ma trận. Việc “cứng hóa” có nghĩa là sau mỗi nhịp xung đồng hồ máy thực hiện đồng thời N phép toán (ví dụ, N = 256*256). Một nhịp xung đồng hồ tương đương với một clock của khối thạch anh. Ví dụ, TPUv1 có clock speed là 700 MHz – nghĩa là trong 1 giây có 700 triệu nhịp xung đồng hồ.

Vấn đề là thiết kế phần cứng như thế nào?

-

. Kiến trúc TPU.

Yêu cầu thiết kế

Vào thời điểm năm 2013, khi nói đến Google là chúng ta nói đến công ty phần mềm máy tính, là công ty sở hữu công cụ tìm kiếm trên mạng Internet. Họ không chuyên về phần cứng. Vì vậy, cách mà Google tiếp cận giải quyết vấn đề là họ mời một kiến trúc sư phần cứng danh tiếng làm trưởng nhóm kỹ thuật dự án, đó là ông  Norman Jouppi. Mọi thứ sau đó phải theo quan điểm của trưởng nhóm.

Theo quan điểm của ông này, thiết kế TPU cần tư duy cấp tiến, đột phá. Lúc đầu họ đặt lên bàn rất nhiều phương án thiết kế để tạo ra một con “chip suy luận” (inference) bằng việc lai tạo từ CPU và GPU, nhưng cuối cùng Jouppi chọn một hướng đi riêng cho Google. Jouppi cho biết nhóm kỹ thuật phần cứng đã nghĩ đến FPGA để giải quyết vấn đề: giá rẻ, hiệu quả và hiệu suất cao trước khi chuyển sang giải pháp ASIC. Ông giải thích: “Lý lẽ cơ bản mà mọi người đưa ra đối với FPGA là họ muốn thứ gì đó dễ thay đổi nhưng vấn đề hiệu suất (performance), vấn đề khả năng lập trình (programmability), vấn đề tiêu hao năng lượng thấp thì FPGA không bằng ASIC”. “TPU có thể lập trình được như CPU ​​hoặc GPU. Nó không chỉ được thiết kế cho một mô hình mạng nơ-ron; nó thực thi các lệnh CISC trên nhiều mô hình. Vì vậy, nó vẫn có thể lập trình được, nhưng sử dụng ma trận làm nguyên hàm thay vì vectơ hoặc số vô hướng”.

-

Kết luận: TPU ngoài việc chạy nhanh còn phải “tiêu hao năng lượng thấp”.

Ngoài ra, vì họ cần triển khai TPU vào các máy chủ hiện có lúc đó của Google một cách nhanh nhất có thể, họ đã chọn giải pháp thiết kế bộ xử lý TPU dưới dạng card gắn ngoài, cắm vào một khe PCI trên bo mạch chủ.

-

Sơ đồ khối

Hình 2: Sơ đồ khối TPU (nguồn)

 



Hình 2 ở trên mô tả sơ đồ khối của TPU. Quy ước về màu trong sơ đồ trên:

·       Xanh lá cây: Phần I/O không thuộc TPU

·       Xanh da trời: Dữ liệu đệm trong TPU

·       Vàng: Mảng tính toán

·       Đỏ: Mảng điều khiển

-

Để không làm nhức đầu anh/chị, tôi trích xuất một số khối cơ bản trong sơ đồ trên:

·       Matrix Multiplier Unit (MXU): Khối nhân ma trận (màu vàng ở góc phải trên). Khối này gồm 65,536 bộ MAC (Multiply-Accumulate - nhân & cộng dồn).

·       Unified Buffer (UB): Vùng bộ nhớ đệm hợp nhất (màu xanh da trời ở giữa) chứa 24MB bộ nhớ SRAM. Bộ nhớ này đóng vai là các thanh ghi (register).

·       Activation Unit (AU): Khối hàm kích hoạt (màu vàng ở góc phải dưới). Các hàm này được “cứng hóa”.

Nhằm kiểm soát sự phối hợp giữa các khối này, người ta đưa vào nhiều câu lệnh (instruction). Dưới đây là các câu lệnh chính:

1.     Read_Host_Memory: câu lệnh đọc bộ nhớ của CPU và chuyển vào bộ nhớ đệm UB.

2.     Read_Weights: câu lệnh đọc bộ nhớ trọng số (Weight Memory) và chuyển vào hàng đợi FIFO (Weight FIFO). Weight FIFO là một đầu vào của MXU.

3.     MatrixMultiply/Convolve: câu lệnh này kích hoạt MXU thực hiện phép nhân với UB và lũy kế vào Accumulators. Cách thực thi: đầu tiên, trọng số được đọc vào ma trận vuông 256x256 ô (bước 2 ở trên). Đầu vào [x] được chia thành B mảng 256: Input = mảng B*256. Phép nhân được thực hiện B nhịp xung (xem thêm phần Systolic Array ở dưới). Dưới góc độ lập trình, chúng ta có thể viết như sau:
Accumulators = Input * Weights.

4.     Activate: câu lệnh kích hoạt hàm phi tuyến activation function với các tùy chọn như ReLU, Sigmoid, … Kết quả sau khi áp hàm kích hoạt được lưu vào bộ nhớ UB. Nếu gọi hàm kích hoạt là factivation, dưới góc độ lập trình, chúng ta có thể viết như sau:
UB = factivation (Accumulators).

5.     Write_Host_Memory: câu lệnh đọc dữ liệu từ bộ nhớ đệm UB của TPU và ghi vào bộ nhớ của CPU.

-

Luồng xử lý của TPU

Cách phối hợp giữa CPU và TPU tương tự như cách phối hợp giữa CPU và GPU: vai của CPU là chủ (host) và vai của TPU là thiết bị (device). CPU thiết lập các tham số trước khi “ra lệnh” (instruct) TPU thực hiện các phép toán.

-

Có thể khái quát luồng xử lý trong nội tại TPU như sau:

1.     TPU đọc bộ nhớ từ CPU và ghi vào bộ nhớ UB (Read_Host_Memory)

2.     TPU đọc trọng số từ bộ nhớ DRAM (bộ nhớ ngoài – ký hiệu DDR DRAM Chips trong hình 2) ghi vào Weight FIFO (bộ nhớ trong của TPU) (Read_Weights)

3.     Nạp trước trọng số (weights) vào 256x256 ô MAC (bộ nhân và cộng dồn) của MXU – lấy dữ liệu từ Weight FIFO (phía trên khối MXU)

4.     Thiết lập dữ liệu systolic trong khối Systolic Data Setup (phía trái khối MXU)

5.     Thực thi phép nhân ma trận: [dữ liệu systolic: B*256] x [trọng số (weights): 256*256] bằng loạt nhịp xung đồng hồ. Kết quả ghi vào Accumulators (phía dưới khối MXU) (MatrixMultiply/Convolve)

6.     Áp hàm kích hoạt (Activation), áp hàm chuẩn hóa (Normalize / Pool), ghi kết quả vào bộ nhớ UB (Activate)

7.     Đọc kết quả trong bộ nhớ UB và ghi vào bộ nhớ của CPU (Write_Host_Memory)

-

.Systolic Array: trái tim của TPU.

Bây giờ chúng ta tò mò cùng tìm hiểu xem TPU thực hiện phép nhân ma trận như thế nào.

Nhân ma trận

Nhưng trước hết chúng ta cùng nhắc lại khái niệm nhân ma trận. Giả thiết chúng ta nhân 2 ma trận A và B với nhau được ma trận C như trong hình 3. A có m hàng, n cột (m × n), B có n hàng, p cột (n × p), C có m hàng và p cột (m × p). Chú ý rằng A và B muốn nhân được với nhau thì số cột của A phải bằng số hàng của B.

Hình 3: Nhân ma trận: A × B = C

 

 

Mỗi một ô trong ma trận C (màu đỏ) = tổng của các tích của ô trong ma trận A (màu xanh lá cây) với ô trong ma trận B (màu xanh nước biển):


Để tính cij chúng ta cần n phép nhân và (n-1) phép cộng.

Bên lề

Việc tính các ô trong ma trận C là hoàn toàn độc lập với nhau nên người ta có thể áp dụng tính toán song song đối m × p ô của C. Đây là lý do vì sao các GPU được áp dụng rộng rãi trong mạng nơ-ron (neural network): các ô cij được tính song song với nhau bằng hàng ngàn processor của GPU.

❰/Bên lề

-

Systolic Array

Bây giờ chúng ta bàn đến kiến trúc systolic. Đây là một kiến trúc phần cứng khá thú vị, đã được đề cập đến bằng một bài báo từ năm 1982. Anh/chị nào có thời gian tìm hiểu sâu về vấn đề này xin tham khảo ở đây.

Hệ thống systolic là mảng hình lưới các ô có tên gọi là PE. PE là viết tắt của Processing Element – tạm dịch là phần tử xử lý. Mỗi phần tử PE thực hiện phép toán như nhân, cộng và truyền dữ liệu sang phần tử kế tiếp. Thông tin được truyền từ ô này sang ô bên cạnh theo hình thức “đường ống” – không sử dụng bộ nhớ trung gian. Việc không sử dụng bộ nhớ trung gian vừa tăng tốc độ xử lý vừa giảm thiểu tiêu hao năng lượng. Giao tiếp với thế giới bên ngoài chỉ thực hiện ở các ô biên (xem hình 4 dưới đây).

Phương thức xử lý của hệ thống systolic gần giống với phương thức xử lý “đường ống”. Chỉ khác là hệ thống systolic có đường ống hai chiều: ống đẩy từ trái qua phải và ống đẩy từ trên xuống dưới.

 


Hình 4: Kiến trúc hệ thống mảng Systolic (nguồn).

 

Khối MXU của TPU là mảng systolic gồm N x N (N=256) bộ MAC. MAC tương đương với PE trong hình 4.

MXU thực hiện phép nhân ma trận như thế nào?

Để đơn giản hóa vấn đề, tôi xin phép minh họa bằng việc nhân 2 ma trận 3x3: WA=Y.

Trước khi thực hiện phép nhân ma trận, người ta nạp trước W (mảng trọng số) và sắp xếp các phần tử của ma trận A như trong hình 5 dưới đây.

Phép nhân ma trận được thực hiện bằng các nhịp xung đồng hồ (clock). Chúng ta ký hiệu một ô trong lưới systolic là w(i,j).Sau mỗi nhịp xung, các ô trong lưới sẽ thực hiện các phép toán sau:

1.     Lấy giá trị w(i,j) nhân với đầu vào a (đầu vào a được truyền từ phía trái sang). Nếu j > 1 thì đầu vào a là w(i,j-1). Nếu j = 1 thì đầu vào là từ một phần tử thuộc mảng A (bên trái).

2.     Lấy kết quả phép nhân w(i,j)*a cộng với giá trị s của ô phía trên truyền xuống được w(i,j)*a + s. Nếu i > 1 thì s chính là giá trị của ô w(i-1,j). Nếu i = 1 thì s = 0.

3.     Truyền giá trị đầu vào a sang ô bên phải: w(i, j+1), trừ trường hợp j = N.

4.     Truyền giá trị w(i,j)*a + s xuống ô bên dưới: w(i+1, j), trừ trường hợp i = N.

-

 


Hình 5: Sắp xếp các phần tử mảng A và nạp trước dữ liệu vào các phần tử mảng W.

Chú ý: Các phần tử của ma trận A được sắp xếp theo hình bình hành, thứ tự cột từ phải sang trái. Các ô trống được bù bằng giá trị 0 (không).

 

Minh họa

Tiếp theo, xin mời anh/chị xem minh họa theo các thời điểm t=1, t=2, …

 

Toàn bộ dữ liệu ma trận A tịnh tiến sang phải.

Chú ý: phép nhân đầu tiên w11a11 (góc trái trên của MXU).

 

 


Toàn bộ dữ liệu ma trận A tiếp tục tịnh tiến sang phải.

Chú ý: Phép nhân và cộng dồn ở các ô của MXU. Đồng thời quan sát việc truyền dữ liệu từ trái sang phải và từ trên xuống dưới.

 

 


 Toàn bộ dữ liệu ma trận A tiếp tục tịnh tiến sang phải.

Chú ý: Phép nhân và cộng dồn ở các ô của MXU. Đồng thời quan sát việc truyền dữ liệu từ trái sang phải và từ trên xuống dưới.

 

 

 


Chú ý: xuất hiện đầu ra đầu tiên: y11 của ma trận Y.

 

 

 


 

Chú ý: xuất hiện thêm 2 phần tử y12 và y21 của ma trận Y (ngoài y11 ở thời điểm trước).

 

 

 


 

Chú ý: xuất hiện thêm 3 phần tử y13, y22 và y31 của ma trận Y.

 

 

 


Chú ý: xuất hiện thêm 3 phần tử 0, y23 và y32 của ma trận Y.

 

 

 

 


MXU hoàn tất phép nhân ma trận.

Chú ý: Các phần tử của ma trận Y xếp theo hình bình hành, chuyển vị (transpose) trục hoành thành trục tung.

 

-

. Trải nghiệm so sánh CPU, GPU, TPU.

Phần này tôi xin giới thiệu với anh/chị cách thử và so sánh thời gian xử lý của CPU, GPU, TPU ngay trên chính PC/Laptop của anh/chị.

💡 Ý tưởng là trên cùng phép toán, chúng ta thử tính thời gian xử lý phép toán đó của CPU và thời gian xử lý cũng cùng phép toán đó của GPU, TPU. Tôi chọn 2 phép toán để so sánh:

·       Phép toán 1: nhân 2 số vô hướng với nhau

·       Phép toán 2: nhân 2 ma trận với nhau – mỗi ma trận có 10,000 dòng, 10,000 cột (là ma trận có 100 triệu số thực). Ma trận này được khởi tạo bởi một hàm ngẫu nhiên.

Công cụ mà tôi sử dụng là google colab notebook (đặt tên file là “CPU, GPU, TPU comparison.ipynb”). Trong file này tôi sử dụng ngôn ngữ lập trình Python trên nền framework PyTorch. Anh/chị nào có nhã ý tìm hiểu chi tiết xin mời anh/chị tham khảo phần Phụ lục.

Giải thích ý tưởng

Tôi chia phần chương trình thành 3 đoạn: đoạn 1 do CPU xử lý, đoạn 2 do GPU xử lý và đoạn 3 do TPU xử lý. Tôi đánh số các Cell để anh/chị tiện theo dõi. Trong mỗi Cell, ngay dòng lệnh đầu tiên tôi sử dụng hàm %%timeit để đo thời gian xử lý của cả Cell. Anh/chị nào tò mò về lập trình của %%timeit xin tham khảo ở đây.

·       Cell[1], Cell[2], Cell[3] do CPU xử lý.

·       Cell[4], Cell[5], Cell[6], Cell[7] do GPU xử lý

·       Cell[8], Cell[9], Cell[10] do TPU xử lý

 

-

CPU

Cell [1]:      import framework PyTorch

Cell [2]:      Đo thời gian xử lý nhân 2 số với nhau (thực chất là nhân 2 ma trận (1,1) với nhau). Thời gian CPU xử lý mất khoảng 6.4 micro giây.

Cell [3]:      Đo thời gian xử lý nhân 2 ma trận (10000, 10000) với nhau. Thời gian CPU xử lý mất khoảng 29.1 giây (gần nửa phút).

-

GPU

Trước khi xử lý, chuyển sang chế độ chạy bằng GPU. Cách chuyển như sau:

·       Click menu Runtime

·       Chọn Change Runtime Type

·       Chọn GPU

Cell[4]:       import framework PyTorch

Cell[5]:       chọn device là CUDA

Cell[6]:       Đo thời gian xử lý nhân 2 số với nhau (thực chất là nhân 2 ma trận [1,1] với nhau). Thời gian GPU xử lý mất khoảng 60 micro giây (so với CPU chỉ mất 6.4 micro giây).

Cell[7]:       Đo thời gian xử lý nhân 2 ma trận (10000, 10000) với nhau. Thời gian GPU xử lý mất khoảng 986 mili giây (chưa đầy 1 giây) so với CPU xử lý mất 29.1 giây.

-

TPU

Trước khi xử lý, chuyển sang chế độ chạy bằng TPU. Cách chuyển như sau:

·       Click menu Runtime

·       Chọn Change Runtime Type

·       Chọn TPU

Cell[8]:       import framework PyTorch

import torch_xla

import torch_xla.core.xla_model as xm

Cell[9]:       Đo thời gian xử lý nhân 2 số với nhau (thực chất là nhân 2 ma trận [1,1] với nhau). Thời gian TPU xử lý mất khoảng 577 micro giây (so với CPU chỉ mất 6.4 micro giây).

Cell[10]:     Đo thời gian xử lý nhân 2 ma trận (10000, 10000) với nhau. Thời gian TPU xử lý mất khoảng 615 micro giây (hơn 1 nửa mili giây) so với CPU xử lý mất 29.1 giây (gần nửa phút), GPU mất 986 mili giây. Tức là TPU nhanh hơn GPU 1,500 lần.
-
Có một điểm thú vị là TPU nhân 2 số với nhau (mất 577 micro giây) không khác nhiều so với nhân 2 ma trận (10000, 10000) với nhau (mất 615 micro giây)!

Hết giải thích ý tưởng

-

Suy ngẫm chậm 🤔

1.     Xuất phát từ nhu cầu thực tế khi tìm kiếm bằng giọng nói (voice search), Google đã cho ra đời bộ tăng tốc (accelerator) TPU. Phiên bản đầu (TPUv1) chỉ để phục vụ khâu Inference trong Deep Learning. Các phiên bản sau (TPUv2, TPUv3, …) thì TPU phục vụ tất cả các khâu trong Deep Learning (Inference & Training). Cuối cùng, TPU được Google tích hợp vào điện toán đám mây Google Cloud Platform. Nghĩa là TPU tham gia vào tất cả các khâu tính toán trên điện toán đám mây của Google.

2.     Amazon cũng có bước đi tương tự. Năm 2019 họ cho ra đời Inferentia nhằm tăng tốc độ xử lý Inference của Deep Learning. Năm 2020 họ tích hợp thêm chip Trainium nhằm tăng tốc độ xử lý cho khâu Training. Khác với Google, Amazon không công bố thiết kế của Inferentia và Trainium.

3.     Chúng ta đang chứng kiến ​​sự chuyển dịch từ GPU đa năng sang IC chuyên dụng (ASIC). Có một điểm khác biệt giữa GPU và IC chuyện dụng: các công ty sản xuất IC chuyên dụng không bán sản phẩm của họ ra thị trường. Không biết là các nhà cung cấp dịch vụ điện toán đám mây trong nước đã bỏ thời gian để khảo sát, cân nhắc xu hướng này chưa?

-

Cuối cùng, nhân dịp Giáng sinh, trân trọng gửi lời chúc Giáng sinh An lành đến tất cả các anh/chị trên diễn đàn ICT-VN!

 













(Credit: Fotor)

-

Trân trọng & vui nhã

(_/)
( •_•)
/ >

LeVanLoi

-

. Phụ lục: Nội dung file “CPU, GPU, TPU comparison.ipynb”

CPU

[1] import torch

---

[2] %%timeit

z = torch.randn(1,1)

result = torch.matmul(z,z)

del z, result

-

6.4 µs ± 157 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

---

[3] %%timeit

z = torch.randn(10000,10000)

result = torch.matmul(z,z)

del z, result

-

29.1 s ± 580 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

 

GPU

Trước khi xử lý, chuyển sang chế độ chạy bằng GPU. Cách chuyển như sau:

·       Click menu Runtime

·       Chọn Change Runtime Type

·       Chọn GPU

 

[4] import torch

---

[5] device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

---

[6] %%timeit

z = torch.randn(1,1).to(device)

result = torch.matmul(z,z)

del z, result

-

The slowest run took 5.22 times longer than the fastest. This could mean that an intermediate result is being cached.

60 µs ± 51.4 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

---

[7]  %%timeit

z = torch.randn(10000,10000).to(device)

result = torch.matmul(z,z)

del z, result

-

986 ms ± 194 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

-

TPU


Trước khi xử lý, chuyển sang chế độ chạy bằng TPU. Cách chuyển như sau:

  • Click menu Runtime
  • Chọn Change Runtime Type
  • Chọn TPU

[8] import torch

import torch_xla

import torch_xla.core.xla_model as xm

 

[9] %%timeit

z = torch.randn(1,1, device=xm.xla_device())

result = torch.matmul(z,z)

del z, result

577 µs ± 83.5 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

[10] %%timeit

z = torch.randn(10000,10000, device=xm.xla_device())

result = torch.matmul(z,z)

del z, result

615 µs ± 64.1 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

 

 

☕ Nhàn đàm S&T: Humanoid Robots 🤖

Phác họa bài post: Đề dẫn. ❶. Humanoid Robots hoạt động thế nào? ❷. Lắp ghép một Humanoid Robot như thế nào? ❸. Huấn luyện Humano...