Từ trước đến nay, ai cũng biết Nvidia bán GPU và sức mạnh tính toán, còn CUDA là vũ khí phần mềm giúp hãng gần như độc quyền trong thế giới AI. Muốn lập trình GPU cho hiệu quả, gần như ai cũng mặc định phải dùng CUDA. Mà đã dùng CUDA thì gần như chắc chắn là dùng card Nvidia. Đây là một sự đồng thuận tồn tại suốt nhiều năm trong ngành.
Thế nhưng gần đây, câu chuyện bắt đầu rẽ sang hướng khác.
Cuối năm ngoái, Nvidia bất ngờ tung ra một công nghệ mới có tên CUDA Tile và tuyên bố đây là bước tiến lớn nhất của CUDA kể từ năm 2006. Điều này khiến không ít người trong giới kỹ thuật giật mình, bởi hiếm khi Nvidia nói những lời mạnh như vậy.
Lý do sâu xa nằm ở chỗ: trước đó không lâu, một nhóm nghiên cứu Trung Quốc đã phát triển một ngôn ngữ lập trình GPU mới mang tên TileLang. Và điều thú vị là ý tưởng cốt lõi của TileLang lại rất giống với CUDA Tile mà Nvidia vừa công bố.
Chưa dừng lại ở đó, khi DeepSeek phát hành phiên bản V3.2, họ tung ra hai bản cùng lúc. Một bản dùng CUDA như trước đây, và một bản được xây dựng bằng TileLang. Đây là lần đầu tiên DeepSeek chủ động rời khỏi sự phụ thuộc tuyệt đối vào CUDA.
Trước kia, DeepSeek viết phần lớn mã bằng CUDA, thậm chí dùng cả PTX là dạng mã lắp ráp độc quyền của Nvidia để vắt kiệt hiệu năng GPU. Cách làm này giúp chạy nhanh, nhưng đổi lại mô hình bị “trói chết” vào card Nvidia.
TileLang thì khác. Ngôn ngữ này không gắn chặt với một hãng phần cứng cụ thể, nên DeepSeek V3.2 có thể chạy tương đối dễ dàng trên các nền tảng trong nước như Huawei Ascend. Từ đây, nhiều người bắt đầu nói vui rằng Nvidia đang bị các nhà sản xuất trong nước gây áp lực, nên phải “chép bài”.
Nhưng thực sự vấn đề nằm ở đâu?
Quy trình đổ bóng đường ống kết xuất (đỉnh → pixel)
Những người làm lập trình GPU lâu năm đều có chung một cảm giác: CUDA ngày càng khó theo kịp thời đại AI. Nó được sinh ra trong thời kỳ GPU chủ yếu dùng để render đồ họa, nơi mọi thứ rất đều và rất giống nhau.
CUDA dựa trên mô hình SIMT, tức là một lệnh điều khiển rất nhiều luồng chạy cùng lúc. Điều này cực kỳ hiệu quả khi làm đồ họa. Ví dụ như trong game bắn súng, khi bị lựu đạn choáng, GPU chỉ việc lặp lại cùng một phép tính cho hàng triệu điểm ảnh để làm màn hình trắng xóa.
Trong thế giới đó, GPU giống như một dây chuyền sản xuất, mỗi công đoạn rõ ràng, lặp đi lặp lại và không cần suy nghĩ nhiều.
Nhưng AI thì khác hẳn. Khi suy luận AI, bước tiếp theo thường phải đợi kết quả của bước trước. Tính toán mang tính rẽ nhánh, phụ thuộc lẫn nhau, không còn đều tăm tắp như đồ họa nữa. GPU vẫn chạy theo nhịp cũ, các luồng phải đi cùng nhau, dẫn đến luồng nhanh phải chờ luồng chậm, hiệu năng bị lãng phí.
Chưa kể, trong AI, rất nhiều kết quả trung gian được dùng đi dùng lại. Nhưng mô hình thực thi của CUDA lại không quan tâm mấy đến việc tái sử dụng dữ liệu. Kết quả thường bị ghi ra bộ nhớ toàn cục rồi lại đọc vào, gây tốn thời gian và năng lượng.
Vì thế, lập trình CUDA ngày càng bị chê là khó viết, khó tối ưu và đòi hỏi lập trình viên không chỉ hiểu thuật toán, mà còn phải tự tay quản lý việc chia luồng, chuyển dữ liệu, đồng bộ hóa. Chỉ cần làm sai một chút là hiệu năng tụt ngay.
Nvidia thực ra cũng nhận ra điều này từ sớm. Năm 2014, họ tung ra cuDNN. Ý tưởng rất đơn giản: thay vì để lập trình viên tự viết các phép toán AI phức tạp bằng CUDA, Nvidia viết sẵn những khối quan trọng như tích chập, nhân ma trận rồi đóng gói lại. Người dùng chỉ việc gọi.
cuDNN giống như đồ ăn nấu sẵn. Nhanh, tiện và ít lỗi. Nhưng nhược điểm cũng rõ ràng. Chỉ dùng được những gì có sẵn trong thực đơn. Khi mô hình xuất hiện toán tử mới, cuDNN không hỗ trợ thì lập trình viên vẫn phải quay lại CUDA và xử lý mọi thứ thủ công.
Hình bên trái - tác vụ tách ra khỏi toàn bộ, hình bên phải - cách luồng được thực thi từng phần tử từ góc độ cục bộ; Cấp luồng của CUDA thuộc về bên phải ~
TileLang đi theo một hướng khác. Nó không cố gắng tạo thêm “món ăn làm sẵn”, mà thay người lập trình gánh phần việc khó nhất: lên lịch cho GPU. Tức là quyết định chia luồng thế nào, dùng dữ liệu ra sao, khi nào cần đồng bộ. Người viết chỉ cần mô tả rõ mình muốn tính cái gì, dữ liệu ở đâu, còn việc ánh xạ xuống phần cứng để chạy nhanh thì để trình biên dịch lo.
Nhờ vậy, ngay cả khi viết một toán tử hoàn toàn mới, lập trình viên cũng không cần quay lại CUDA thuần. Mã ngắn hơn, dễ đọc hơn và hiệu năng vẫn cao. Theo ví dụ chính thức, có trường hợp số dòng mã giảm từ hơn 500 xuống còn khoảng 80, trong khi tốc độ chạy tăng thêm khoảng 30%.
Quan trọng hơn, TileLang chứng minh một điều mà trước đây nhiều người còn nghi ngờ: chỉ cần ngôn ngữ đủ biểu đạt và trình biên dịch đủ thông minh, GPU vẫn có thể chạy rất nhanh mà không cần viết CUDA tay.
Đây chính là lúc Nvidia không thể đứng ngoài nữa. Cuối năm ngoái, họ tung ra CUDA Tile, có thể xem là phiên bản chính thức, “con nhà chính hãng” của hướng tiếp cận kiểu TileLang.
Thông điệp của Nvidia rất rõ. Thay vì để cộng đồng dần quen với ngôn ngữ GPU của bên thứ ba và tìm cách dùng GPU mà không cần CUDA, tốt hơn là Nvidia tự đưa ra giải pháp của mình. Với lợi thế là công nghệ bên thứ nhất, CUDA Tile có con đường tối ưu ngắn nhất cho GPU Nvidia và nhiều khả năng sẽ là lựa chọn an toàn nhất nếu bạn đã xác định dùng card của hãng.
Tuy vậy, điều đó không có nghĩa TileLang hết đất sống.
CUDA Tile dù mạnh đến đâu cũng có một điều kiện tiên quyết: bạn phải dùng GPU Nvidia. Trong khi giá trị lớn nhất của TileLang lại nằm ở chỗ nó không bị trói vào bất kỳ hãng phần cứng nào.
Trước đây, khi mua card đồ họa, người ta thường hỏi hệ sinh thái CUDA có đủ mạnh không, có nhiều công cụ hỗ trợ không. Nhưng nếu TileLang trở nên phổ biến, câu hỏi có thể sẽ thay đổi thành: nếu mai tôi đổi sang chip khác, mã hiện tại có chạy tiếp được không?
Khi đó, dù là GPU AMD, TPU của Google hay chip AI trong nước, chỉ cần TileLang hỗ trợ thì mô hình AI không cần viết lại từ đầu. Các nhà phát triển sẽ có quyền “tự chọn xẻng”, thay vì bị khóa chặt vào một hãng.
Câu chuyện này không hề xa lạ. Trong ngành game, DirectX 12 gắn chặt với Windows và tối ưu rất tốt, nhưng điều đó không ngăn được các công nghệ mở hơn như Vulkan dần chiếm chỗ đứng. Lựa chọn của lập trình viên cho thấy hiệu năng không phải lúc nào cũng là yếu tố duy nhất. Tránh bị phụ thuộc vào một nhà sản xuất đôi khi còn quan trọng hơn.
Và đó chính là lý do vì sao cuộc chơi ngôn ngữ GPU hiện nay trở nên khốc liệt hơn bao giờ hết.
Thế nhưng gần đây, câu chuyện bắt đầu rẽ sang hướng khác.
Cuối năm ngoái, Nvidia bất ngờ tung ra một công nghệ mới có tên CUDA Tile và tuyên bố đây là bước tiến lớn nhất của CUDA kể từ năm 2006. Điều này khiến không ít người trong giới kỹ thuật giật mình, bởi hiếm khi Nvidia nói những lời mạnh như vậy.
Lý do sâu xa nằm ở chỗ: trước đó không lâu, một nhóm nghiên cứu Trung Quốc đã phát triển một ngôn ngữ lập trình GPU mới mang tên TileLang. Và điều thú vị là ý tưởng cốt lõi của TileLang lại rất giống với CUDA Tile mà Nvidia vừa công bố.
Chưa dừng lại ở đó, khi DeepSeek phát hành phiên bản V3.2, họ tung ra hai bản cùng lúc. Một bản dùng CUDA như trước đây, và một bản được xây dựng bằng TileLang. Đây là lần đầu tiên DeepSeek chủ động rời khỏi sự phụ thuộc tuyệt đối vào CUDA.
Trước kia, DeepSeek viết phần lớn mã bằng CUDA, thậm chí dùng cả PTX là dạng mã lắp ráp độc quyền của Nvidia để vắt kiệt hiệu năng GPU. Cách làm này giúp chạy nhanh, nhưng đổi lại mô hình bị “trói chết” vào card Nvidia.
TileLang thì khác. Ngôn ngữ này không gắn chặt với một hãng phần cứng cụ thể, nên DeepSeek V3.2 có thể chạy tương đối dễ dàng trên các nền tảng trong nước như Huawei Ascend. Từ đây, nhiều người bắt đầu nói vui rằng Nvidia đang bị các nhà sản xuất trong nước gây áp lực, nên phải “chép bài”.
Nhưng thực sự vấn đề nằm ở đâu?
Quy trình đổ bóng đường ống kết xuất (đỉnh → pixel)
Những người làm lập trình GPU lâu năm đều có chung một cảm giác: CUDA ngày càng khó theo kịp thời đại AI. Nó được sinh ra trong thời kỳ GPU chủ yếu dùng để render đồ họa, nơi mọi thứ rất đều và rất giống nhau.
CUDA dựa trên mô hình SIMT, tức là một lệnh điều khiển rất nhiều luồng chạy cùng lúc. Điều này cực kỳ hiệu quả khi làm đồ họa. Ví dụ như trong game bắn súng, khi bị lựu đạn choáng, GPU chỉ việc lặp lại cùng một phép tính cho hàng triệu điểm ảnh để làm màn hình trắng xóa.
Trong thế giới đó, GPU giống như một dây chuyền sản xuất, mỗi công đoạn rõ ràng, lặp đi lặp lại và không cần suy nghĩ nhiều.
Nhưng AI thì khác hẳn. Khi suy luận AI, bước tiếp theo thường phải đợi kết quả của bước trước. Tính toán mang tính rẽ nhánh, phụ thuộc lẫn nhau, không còn đều tăm tắp như đồ họa nữa. GPU vẫn chạy theo nhịp cũ, các luồng phải đi cùng nhau, dẫn đến luồng nhanh phải chờ luồng chậm, hiệu năng bị lãng phí.
Chưa kể, trong AI, rất nhiều kết quả trung gian được dùng đi dùng lại. Nhưng mô hình thực thi của CUDA lại không quan tâm mấy đến việc tái sử dụng dữ liệu. Kết quả thường bị ghi ra bộ nhớ toàn cục rồi lại đọc vào, gây tốn thời gian và năng lượng.
Vì thế, lập trình CUDA ngày càng bị chê là khó viết, khó tối ưu và đòi hỏi lập trình viên không chỉ hiểu thuật toán, mà còn phải tự tay quản lý việc chia luồng, chuyển dữ liệu, đồng bộ hóa. Chỉ cần làm sai một chút là hiệu năng tụt ngay.
Nvidia thực ra cũng nhận ra điều này từ sớm. Năm 2014, họ tung ra cuDNN. Ý tưởng rất đơn giản: thay vì để lập trình viên tự viết các phép toán AI phức tạp bằng CUDA, Nvidia viết sẵn những khối quan trọng như tích chập, nhân ma trận rồi đóng gói lại. Người dùng chỉ việc gọi.
cuDNN giống như đồ ăn nấu sẵn. Nhanh, tiện và ít lỗi. Nhưng nhược điểm cũng rõ ràng. Chỉ dùng được những gì có sẵn trong thực đơn. Khi mô hình xuất hiện toán tử mới, cuDNN không hỗ trợ thì lập trình viên vẫn phải quay lại CUDA và xử lý mọi thứ thủ công.
Hình bên trái - tác vụ tách ra khỏi toàn bộ, hình bên phải - cách luồng được thực thi từng phần tử từ góc độ cục bộ; Cấp luồng của CUDA thuộc về bên phải ~
TileLang đi theo một hướng khác. Nó không cố gắng tạo thêm “món ăn làm sẵn”, mà thay người lập trình gánh phần việc khó nhất: lên lịch cho GPU. Tức là quyết định chia luồng thế nào, dùng dữ liệu ra sao, khi nào cần đồng bộ. Người viết chỉ cần mô tả rõ mình muốn tính cái gì, dữ liệu ở đâu, còn việc ánh xạ xuống phần cứng để chạy nhanh thì để trình biên dịch lo.
Nhờ vậy, ngay cả khi viết một toán tử hoàn toàn mới, lập trình viên cũng không cần quay lại CUDA thuần. Mã ngắn hơn, dễ đọc hơn và hiệu năng vẫn cao. Theo ví dụ chính thức, có trường hợp số dòng mã giảm từ hơn 500 xuống còn khoảng 80, trong khi tốc độ chạy tăng thêm khoảng 30%.
Quan trọng hơn, TileLang chứng minh một điều mà trước đây nhiều người còn nghi ngờ: chỉ cần ngôn ngữ đủ biểu đạt và trình biên dịch đủ thông minh, GPU vẫn có thể chạy rất nhanh mà không cần viết CUDA tay.
Đây chính là lúc Nvidia không thể đứng ngoài nữa. Cuối năm ngoái, họ tung ra CUDA Tile, có thể xem là phiên bản chính thức, “con nhà chính hãng” của hướng tiếp cận kiểu TileLang.
Thông điệp của Nvidia rất rõ. Thay vì để cộng đồng dần quen với ngôn ngữ GPU của bên thứ ba và tìm cách dùng GPU mà không cần CUDA, tốt hơn là Nvidia tự đưa ra giải pháp của mình. Với lợi thế là công nghệ bên thứ nhất, CUDA Tile có con đường tối ưu ngắn nhất cho GPU Nvidia và nhiều khả năng sẽ là lựa chọn an toàn nhất nếu bạn đã xác định dùng card của hãng.
Tuy vậy, điều đó không có nghĩa TileLang hết đất sống.
CUDA Tile dù mạnh đến đâu cũng có một điều kiện tiên quyết: bạn phải dùng GPU Nvidia. Trong khi giá trị lớn nhất của TileLang lại nằm ở chỗ nó không bị trói vào bất kỳ hãng phần cứng nào.
Trước đây, khi mua card đồ họa, người ta thường hỏi hệ sinh thái CUDA có đủ mạnh không, có nhiều công cụ hỗ trợ không. Nhưng nếu TileLang trở nên phổ biến, câu hỏi có thể sẽ thay đổi thành: nếu mai tôi đổi sang chip khác, mã hiện tại có chạy tiếp được không?
Khi đó, dù là GPU AMD, TPU của Google hay chip AI trong nước, chỉ cần TileLang hỗ trợ thì mô hình AI không cần viết lại từ đầu. Các nhà phát triển sẽ có quyền “tự chọn xẻng”, thay vì bị khóa chặt vào một hãng.
Câu chuyện này không hề xa lạ. Trong ngành game, DirectX 12 gắn chặt với Windows và tối ưu rất tốt, nhưng điều đó không ngăn được các công nghệ mở hơn như Vulkan dần chiếm chỗ đứng. Lựa chọn của lập trình viên cho thấy hiệu năng không phải lúc nào cũng là yếu tố duy nhất. Tránh bị phụ thuộc vào một nhà sản xuất đôi khi còn quan trọng hơn.
Và đó chính là lý do vì sao cuộc chơi ngôn ngữ GPU hiện nay trở nên khốc liệt hơn bao giờ hết.