Build and Share ROCm Kernels Easily with Hugging Face
Xây dựng và Chia sẻ ROCm Kernels Dễ dàng với Hugging Face
- 17 min read
Dễ dàng xây dựng và chia sẻ Kernel ROCm với Hugging Face
Hugging Face đang trên hành trình thúc đẩy và dân chủ hóa trí tuệ nhân tạo thông qua mã nguồn mở và khoa học mở.
Giới thiệu
Kernel tùy chỉnh là xương sống của học sâu hiệu suất cao, cho phép các hoạt động GPU được điều chỉnh chính xác cho khối lượng công việc của bạn; cho dù đó là xử lý hình ảnh, biến đổi tensor hay các tác vụ nặng về tính toán khác. Nhưng việc biên dịch các kernel này cho các kiến trúc phù hợp, kết nối tất cả các cờ xây dựng và tích hợp chúng một cách rõ ràng vào các tiện ích mở rộng PyTorch có thể nhanh chóng trở thành một mớ hỗn độn của CMake/Nix, lỗi trình biên dịch và các vấn đề ABI, điều này không thú vị. Các thư viện kernel-builder và kernels của Hugging Face giúp việc chia sẻ các kernel này với kernels-community trở nên dễ dàng, với hỗ trợ cho nhiều bộ xử lý GPU và tăng tốc khác nhau, bao gồm CUDA, ROCm, Metal và XPU. Điều này đảm bảo các kernel của bạn nhanh, di động và tích hợp liền mạch với PyTorch.
Trong hướng dẫn này, chúng tôi tập trung hoàn toàn vào các kernel tương thích với ROCm và chỉ ra cách xây dựng, kiểm tra và chia sẻ chúng bằng kernel-builder. Bạn sẽ học cách tạo các kernel chạy hiệu quả trên GPU AMD, cùng với các phương pháp hay nhất để có thể tái sản xuất, đóng gói và triển khai.
Hướng dẫn dành riêng cho ROCm này là phiên bản được tối giản hóa của hướng dẫn kernel-builder ban đầu. Nếu bạn đang tìm kiếm phiên bản tập trung vào CUDA rộng hơn, bạn có thể tìm thấy nó tại đây: Hướng dẫn xây dựng và mở rộng các Kernel CUDA sẵn sàng cho sản xuất.
Các bước xây dựng
Chúng tôi sẽ sử dụng kernel GEMM từ RadeonFlow_Kernels làm ví dụ. Nếu bạn muốn đi thẳng vào hướng dẫn, hãy nhấp vào đây.
Về kernel
Phần này được viết bởi các tác giả kernel GEMM của RadeonFlow để giới thiệu kernel. Tác giả: ColorsWind, Zesen Liu, và Andy
Kernel RadeonFlow GEMM là một triển khai nhân phép nhân ma trận theo khối, hiệu suất cao, định dạng FP8 được tối ưu hóa cho GPU AMD Instinct MI300X. GEMM (Nhân Ma trận Tổng quát) là khối xây dựng cốt lõi đằng sau hầu hết các khối lượng công việc học sâu: cho hai ma trận A và B, bạn tính tích C = A × B của chúng. Ở đây nó được triển khai bằng FP8, một định dạng dấu phẩy động có độ chính xác thấp, đánh đổi một chút độ chính xác để lấy thông lượng cao hơn nhiều và băng thông bộ nhớ thấp hơn. Kernel này được phát triển cho Thử thách nhà phát triển AMD 2025, nó đã giành được 🏆 Giải thưởng Lớn vào Tháng 6 năm 2025, công nhận sự xuất sắc của nó về hiệu suất và đổi mới trên phần cứng AMD.
Kernel hoạt động trên đầu vào được lượng tử hóa bằng định dạng dấu phẩy động e4m3fnuz và áp dụng hệ số tỷ lệ theo khối để bảo toàn độ chính xác trong quá trình tính toán có độ chính xác thấp. Định dạng e4m3fnuz là một biến thể FP8 với 4 bit số mũ và 3 bit số thực, được thiết kế để hiệu quả cho các khối lượng công việc mạng nơ-ron. Vì FP8 có dải động nhỏ hơn nhiều so với FP16/FP32, chúng tôi áp dụng hệ số tỷ lệ theo khối (a_scale và b_scale) để mỗi khối giá trị được co giãn lại vào một phạm vi “thoải mái” về mặt số học trước và sau khi tính toán, điều này giúp bảo toàn độ chính xác mặc dù có độ chính xác thấp. Nó nhận các đối số sau:
(a, b, a_scale, b_scale, c)
trong đó a và b là các ma trận đầu vào, a_scale và b_scale là các hệ số tỷ lệ cho a và b tương ứng,
và c là ma trận đầu ra:
alà K × M ở định dạng e4m3fnuzblà K × N ở định dạng e4m3fnuza_scalelà (K // 128) × M ở định dạng fp32b_scalelà (K // 128) × (N // 128) ở định dạng fp32clà M × N ở định dạng bf16
Kernel được biên dịch trước cho các hình dạng ma trận cụ thể và giả định bố cục bộ nhớ được chuyển vị (như yêu cầu của cuộc thi). Để hỗ trợ các hình dạng bổ sung hoặc bố cục bộ nhớ thay thế, bạn phải sửa đổi trình khởi chạy kernel.
Vì vậy, bây giờ chúng ta có một kernel ROCm hiệu suất cao, câu hỏi tự nhiên là: làm thế nào để chúng ta tích hợp nó vào quy trình làm việc PyTorch thực tế và chia sẻ nó với những người khác? Đó chính xác là những gì chúng ta sẽ đề cập tiếp theo, sử dụng kernel-builder và kernels để cấu trúc, xây dựng và xuất bản kernel ROCm.
Đây là một hướng dẫn khá kỹ thuật, nhưng bạn vẫn có thể làm theo từng bước mà không cần hiểu mọi chi tiết và mọi thứ sẽ hoạt động tốt. Nếu bạn tò mò, bạn luôn có thể quay lại sau để tìm hiểu sâu hơn về các khái niệm.
Bước 1: Cấu trúc dự án
Hugging Face Kernel Builder mong đợi các tệp của bạn được tổ chức như sau:
gemm/ ├── build.toml ├── gemm │ └── gemm_kernel.h ├── flake.nix └── torch-ext ├── torch_binding.cpp ├── torch_binding.h └── gemm └── init.py
- build.toml: Tệp kê khai dự án; nó là bộ não của quy trình xây dựng.
- gemm/: Mã nguồn CUDA thô của bạn, nơi phép thuật GPU diễn ra.
- flake.nix: Chìa khóa để có một môi trường xây dựng hoàn hảo, có thể tái sản xuất.
- torch-ext/gemm/: Lớp bao bọc Python cho các toán tử PyTorch thô
Đôi khi dự án của bạn có thể phụ thuộc vào các tệp khác, như kiểm thử hoặc tập lệnh trợ giúp, và bạn có thể thêm chúng mà không gặp vấn đề gì. Trong trường hợp của chúng tôi, dự án của chúng tôi sẽ được cấu trúc như sau:
gemm/ ├── build.toml ├── gemm │ ├── gemm_kernel.h │ ├── gemm_kernel_legacy.h │ ├── transpose_kernel.h │ └── gemm_launcher.hip ├── include │ ├── clangd_workaround.h │ ├── gpu_libs.h │ ├── gpu_types.h │ └── timer.h ├── src/utils │ ├── arithmetic.h │ └── timer.hip ├── tests/checker │ ├── checker.cpp │ ├── metrics.h │ └── checker.h ├── flake.nix └── torch-ext ├── torch_binding.cpp ├── torch_binding.h └── gemm └── init.py
Nếu bạn nhìn vào các tệp gốc của kernel gemm trong RadeonFlow Kernels, chúng là các tệp nguồn HIP với phần mở rộng .cpp. Là bước đầu tiên, bạn cần thay đổi các phần mở rộng này thành .h hoặc .hip tùy thuộc vào nội dung và cách sử dụng của chúng:
- Sử dụng
.hcho các tệp tiêu đề chứa khai báo kernel, hàm nội tuyến hoặc mã mẫu sẽ được bao gồm trong các tệp khác - Sử dụng
.hipcho các tệp triển khai chứa mã HIP/GPU cần được biên dịch riêng (ví dụ: trình khởi chạy kernel, hàm thiết bị với các triển khai phức tạp)
Trong ví dụ của chúng tôi, gemm_kernel.h, gemm_kernel_legacy.h và transpose_kernel.h là các tệp tiêu đề, trong khi gemm_launcher.hip là một tệp triển khai HIP. Quy ước đặt tên này giúp kernel-builder xác định và biên dịch chính xác từng loại tệp.
Bước 2: Thiết lập tệp cấu hình
Tệp kê khai build.toml
Tệp này điều phối toàn bộ quá trình xây dựng. Nó cho kernel-builder biết phải biên dịch những gì và mọi thứ kết nối như thế nào.
toml [general] name = “gemm” universal = false
[torch] src = [ “torch-ext/torch_binding.cpp”, “torch-ext/torch_binding.h”, ]
[kernel.gemm] backend = “rocm” rocm-archs = [ “gfx942”, ]
depends = [“torch”]
src = [ “include/clangd_workaround.h”, “include/gpu_libs.h”, “include/gpu_types.h”, “include/timer.h”, “gemm/gemm_kernel.h”, “gemm/gemm_kernel_legacy.h”, “gemm/gemm_launcher.hip”, “gemm/transpose_kernel.h”, “src/utils/arithmetic.h”, “src/utils/timer.hip”, “tests/checker/metrics.h”, ]
include = [“include”]
chung
Phần này chứa các cài đặt cấu hình chung của dự án.
- tên (bắt buộc): Tên dự án của bạn. Điều này phải khớp với tên kernel của bạn và sẽ được sử dụng cho gói Python.
- đại năng (tùy chọn): kernel là kernel đa năng khi được đặt thành
true. Kernel đa năng là gói Python thuần túy (không có tệp biên dịch). Kernel đa năng không sử dụng các phần khác được mô tả bên dưới. Một ví dụ điển hình về kernel đa năng là kernel Triton. Mặc định:false
torch
Phần này mô tả cấu hình tiện ích mở rộng Torch. Nó xác định các ràng buộc Python sẽ hiển thị kernel của bạn cho PyTorch.
- src (bắt buộc): Một danh sách các tệp nguồn và tiêu đề cho tiện ích mở rộng PyTorch. Trong trường hợp của chúng tôi, điều này bao gồm các tệp ràng buộc C++ tạo giao diện Python.
kernel.gemm
Đặc tả của một kernel có tên “gemm”. Bạn có thể xác định nhiều phần kernel trong cùng một tệp build.toml nếu bạn có nhiều kernel.
- backend (bắt buộc): Bộ xử lý tính toán cho kernel. Chúng tôi sử dụng “rocm” cho hỗ trợ GPU AMD.
- rocm-archs (bắt buộc đối với ROCm): Một danh sách các kiến trúc ROCm mà kernel nên được biên dịch. “gfx942” nhắm mục tiêu vào các GPU dòng MI300.
- phụ thuộc (bắt buộc): Một danh sách các phụ thuộc. Chúng tôi phụ thuộc vào “torch” để sử dụng các phép toán tensor của PyTorch.
- bao gồm (tùy chọn): Thư mục bao gồm tương đối với thư mục gốc dự án. Điều này giúp trình biên dịch tìm tệp tiêu đề.
Tệp sao chép lại flake.nix
Để đảm bảo bất kỳ ai cũng có thể xây dựng kernel của bạn trên bất kỳ máy nào, chúng tôi sử dụng tệp flake.nix. Nó khóa phiên bản chính xác của kernel-builder và tất cả các phụ thuộc bắc cầu của nó. (Bạn chỉ cần sao chép và dán ví dụ này và thay đổi mô tả)
nix { description = “Flake for GEMM kernel”;
inputs = { kernel-builder.url = “github:huggingface/kernel-builder”; };
outputs = { self, kernel-builder, }:
kernel-builder.lib.genFlakeOutputs {
inherit self;
path = ./.;
};
}
Viết Kernel
Bây giờ là mã GPU. Bên trong gemm/gemm_launcher.hip, chúng tôi xác định cách kernel GEMM được khởi chạy.
Tùy thuộc vào cấu hình, chúng tôi gọi triển khai gemm/gemm_kernel được tối ưu hóa mới hoặc quay lại triển khai cũ ( gemm/gemm_kernel_legacy).
cpp // … bao gồm và định nghĩa trước đó extern “C” void run( void *a, void *b, void *as, void *bs, void *c, int m, int n, int k, PerfMetrics *metrics, hipStream_t job_stream0) { const __FP8_TYPE *a_ptr = static_cast<const __FP8_TYPE *>(a); const __FP8_TYPE *b_ptr = static_cast<const __FP8_TYPE *>(b); __BF16_TYPE *c_ptr = static_cast<__BF16_TYPE *>(c); const float *as_ptr = static_cast<const float *>(as); const float *bs_ptr = static_cast<const float *>(bs);
KernelTimerScoped timer(timers, 2LL * m * n * k,
metrics ? &metrics->entries[0].time : nullptr,
metrics ? &metrics->entries[0].gflops : nullptr, job_stream0);
// Điều phối GEMM đến triển khai nhanh nhất có sẵn
switch (pack_shape(m, n, k)) {
DISPATCH_GEMM(1024, 1536, 7168, 256, 128, 128, 4, 2, 512, 4, 16);
DISPATCH_GEMM(6144, 7168, 2304, 256, 128, 128, 4, 2, 512, 1, 16);
default: {
printf("Error: Unsupported shape M=%d, K=%d, N=%d\n", m, k, n);
abort();
}
}
} // …
Đăng ký một toán tử PyTorch gốc
Đây là bước quan trọng. Chúng ta không chỉ làm cho hàm khả dụng trong Python; chúng ta đang biến nó thành một toán tử PyTorch gốc. Điều đó có nghĩa là nó trở thành một phần hạng nhất của chính PyTorch, có thể truy cập thông qua torch.ops.
Tệp torch-ext/torch_binding.cpp xử lý việc đăng ký này.
cpp #include <torch/all.h> #include <torch/library.h> #include <hip/hip_runtime.h>
#include “registration.h” #include “torch_binding.h”
// Khai báo trước hàm C từ gemm_launcher.hip extern “C” { struct PerfMetrics; void run(void *a, void *b, void *as, void *bs, void *c, int m, int n, int k, PerfMetrics *metrics, hipStream_t job_stream0); }
void gemm(torch::Tensor &out, torch::Tensor const &a, torch::Tensor const &b, torch::Tensor const &as, torch::Tensor const &bs) {
// Xác thực thuộc tính tensor
TORCH_CHECK(a.device().is_cuda(), "Input tensor a must be on GPU device");
TORCH_CHECK(b.device().is_cuda(), "Input tensor b must be on GPU device");
TORCH_CHECK(as.device().is_cuda(), "Scale tensor as must be on GPU device");
TORCH_CHECK(bs.device().is_cuda(), "Scale tensor bs must be on GPU device");
TORCH_CHECK(out.device().is_cuda(), "Output tensor out must be on GPU device");
TORCH_CHECK(a.is_contiguous(), "Input tensor a must be contiguous");
TORCH_CHECK(b.is_contiguous(), "Input tensor b must be contiguous");
TORCH_CHECK(as.is_contiguous(), "Scale tensor as must be contiguous");
TORCH_CHECK(bs.is_contiguous(), "Scale tensor bs must be contiguous");
TORCH_CHECK(out.is_contiguous(), "Output tensor out must be contiguous");
// Lấy kích thước ma trận từ hình dạng tensor
// Giả sử a là [M, K], b là [K, N], out là [M, N]
int M = a.size(0);
int K = a.size(1);
int N = b.size(1);
TORCH_CHECK(b.size(0) == K, "Matrix dimensions mismatch: a.size(1) != b.size(0)");
TORCH_CHECK(out.size(0) == M, "Output tensor dimension mismatch: out.size(0) != M");
TORCH_CHECK(out.size(1) == N, "Output tensor dimension mismatch: out.size(1) != N");
// Sử dụng stream HIP mặc định (stream 0)
const hipStream_t stream = 0;
// Gọi hàm C
run(a.data_ptr(), b.data_ptr(), as.data_ptr(), bs.data_ptr(), out.data_ptr(),
M, N, K, nullptr, stream);
}
TORCH_LIBRARY_EXPAND(TORCH_EXTENSION_NAME, ops) { ops.def(“gemm(Tensor! out, Tensor a, Tensor b, Tensor a_scale, Tensor b_scale) -> ()”); ops.impl(“gemm”, torch::kCUDA, &gemm); }
REGISTER_EXTENSION(TORCH_EXTENSION_NAME)
Tệp torch_binding.h chứa các khai báo hàm. Ví dụ, kernel gemm có khai báo sau trong torch_binding.h:
h #pragma once
#include <torch/torch.h>
void gemm(torch::Tensor &out, torch::Tensor const &a, torch::Tensor const &b, torch::Tensor const &as, torch::Tensor const &bs);
Thiết lập trình bao bọc __init__.py
Trong torch-ext/gemm/, chúng ta cần một tệp __init__.py để làm cho thư mục này trở thành một gói Python và để hiển thị toán tử tùy chỉnh của chúng ta một cách thân thiện với người dùng.
python from typing import Optional import torch from ._ops import ops
def gemm(a: torch.Tensor, b: torch.Tensor, as_: torch.Tensor, bs: torch.Tensor, out: Optional[torch.Tensor] = None) -> torch.Tensor:
if out is None:
# Tạo tensor đầu ra với hình dạng và dtype phù hợp
M, K = a.shape
K_b, N = b.shape
assert K == K_b, f"Kích thước ma trận không khớp: A có {K} cột, B có {K_b} hàng"
# Đầu ra phải có kiểu BF16 trên cùng một thiết bị với đầu vào
out = torch.empty((M, N), dtype=torch.bfloat16, device=a.device)
ops.gemm(out, a, b, as_, bs)
return out
Bước 3: Xây dựng kernel
Kernel-builder sử dụng Nix để xây dựng kernel. Bạn có thể xây dựng hoặc chạy kernel trực tiếp nếu bạn đã cài đặt Nix trên hệ thống của mình. Chúng tôi khuyên bạn nên cài đặt Nix theo cách sau:
- Linux: sử dụng trình cài đặt Nix chính thức.
- macOS: sử dụng trình cài đặt Nix Determinate. Ngoài ra, Xcode 16.x hiện được yêu cầu để xây dựng kernel.
Bắt đầu với Nix
Trước tiên, hãy chạy lệnh này:
bash nix flake update
Lệnh này tạo một tệp flake.lock ghim kernel-builder và tất cả các phụ thuộc bắc cầu của nó. Cam kết cả flake.nix và flake.lock vào kho lưu trữ của bạn để đảm bảo các bản dựng kernel có thể tái sản xuất.
Vì kernel-builder phụ thuộc vào nhiều gói (ví dụ: mọi phiên bản PyTorch được hỗ trợ), nên nên bật bộ nhớ cache Hugging Face để tránh các bản dựng lại tốn kém:
bash
Cài đặt cachix và cấu hình bộ nhớ cache
cachix use huggingface
Hoặc chạy nó một lần mà không cần cài đặt cachix vĩnh viễn:
bash
Sử dụng cachix mà không cài đặt nó
nix run nixpkgs#cachix – use huggingface
Xây dựng Kernel bằng Nix
Một kernel có tệp flake.nix có thể được xây dựng bằng lệnh build-and-copy:
bash cd Build_RadeonFlow_Kernels/gemm nix build . -L
Kernel đã biên dịch sau đó sẽ nằm trong thư mục build/ cục bộ.
Vỏ phát triển để phát triển cục bộ
Kernel-builder cung cấp các vỏ để phát triển kernel. Trong một vỏ như vậy, tất cả các phụ thuộc cần thiết đều có sẵn, cũng như build2cmake để tạo các tệp dự án:
bash $ nix develop $ build2cmake generate-torch build.toml $ cmake -B build-ext $ cmake –build build-ext
Nếu bạn muốn kiểm thử kernel như một gói Python, bạn có thể làm như vậy. nix develop sẽ tự động tạo một môi trường ảo trong .venv và kích hoạt nó:
bash $ nix develop $ build2cmake generate-torch build.toml $ pip install –no-build-isolation -e .
Các vỏ phát triển có sẵn cho mọi cấu hình xây dựng. Ví dụ, bạn có thể lấy vỏ phát triển PyTorch 2.7 với ROCm 6.3 bằng:
bash $ rm -rf .venv # Xóa venv hiện có nếu có $ nix develop .#devShells.torch27-cxx11-rocm63-x86_64-linux
Bước 4: Tải kernel lên Hub
Bây giờ chúng ta đã xây dựng kernel, chúng ta có thể kiểm thử nó và tải nó lên Hub.
Xây dựng Kernel cho tất cả các phiên bản PyTorch và ROCm
Một điều nhỏ chúng ta muốn làm trước khi chia sẻ là dọn dẹp tất cả các tạo tác phát triển đã được tạo trong quá trình xây dựng để tránh tải lên các tệp không cần thiết.
bash build2cmake clean build.toml
Để xây dựng kernel cho tất cả các phiên bản PyTorch và ROCm được hỗ trợ, công cụ kernel-builder sẽ tự động hóa quy trình:
bash
Bên ngoài vỏ dev, chạy lệnh sau
nếu bạn ở trong sandbox, bạn có thể thoát bằng exit
nix build . -L
Lưu ý: Quá trình này có thể mất một lúc, vì nó sẽ xây dựng kernel cho tất cả các phiên bản PyTorch và ROCm được hỗ trợ. Đầu ra sẽ nằm trong thư mục
result.
Bước cuối cùng là di chuyển kết quả vào thư mục xây dựng mong đợi (đây là nơi thư viện kernels sẽ tìm kiếm chúng).
bash mkdir -p build rsync -av –delete –chmod=Du+w,Fu+w result/ build/
Đẩy lên Hugging Face Hub
Đẩy các tạo tác xây dựng lên Hub sẽ giúp các nhà phát triển khác dễ dàng sử dụng kernel của bạn.
Đầu tiên, tạo một repo mới:
bash hf repo create gemm
Đảm bảo bạn đã đăng nhập vào Hugging Face Hub bằng cách sử dụng
huggingface-cli login.
Bây giờ, trong thư mục dự án của bạn, hãy kết nối dự án của bạn với kho lưu trữ mới và đẩy mã của bạn:
bash
Khởi tạo git và kết nối với Hugging Face Hub
git init git remote add origin https://huggingface.co/<tên-của-bạn>/gemm
Kéo các thay đổi (chỉ tệp .gitattributes mặc định)
git pull origin main git xet install git checkout -b main
Cập nhật để sử dụng Xet cho các tệp nhị phân
git xet track “*.so”
Thêm và cam kết các thay đổi của bạn (cẩn thận chỉ bao gồm các tệp cần thiết
vì lệnh build2cmake của chúng tôi đã tạo ra nhiều tệp dành riêng cho dev)
git add
build/ gemm/ include/ src/utils tests/checker
torch-ext/torch_binding.cpp torch-ext/torch_binding.h torch-ext/gemm
flake.nix flake.lock build.toml
git commit -m “feat: Đã tạo kernel gemm tuân thủ” git push -u origin main
Tuyệt vời! Kernel của bạn giờ đây đã có trên Hugging Face Hub, sẵn sàng để người khác sử dụng và hoàn toàn tuân thủ thư viện kernels.
Bước 5: Hãy sử dụng nó :)
Với thư viện kernels, bạn không “cài đặt” kernel theo nghĩa truyền thống. Bạn tải nó trực tiếp từ kho lưu trữ Hub của nó, điều này sẽ tự động đăng ký toán tử mới.
python import torch from kernels import get_kernel
Tải kernel từ Hub
gemm = get_kernel(“kernels-community/gemm”)
Kích thước ma trận (phải được hỗ trợ - xem gemm_launcher.cpp)
M, N, K = 1024, 1536, 7168 QUANT_SIZE = 128
Thiết lập thiết bị
device = torch.device(“cuda”)
Tạo đầu vào - kernel yêu cầu A:(K,M), B:(K,N)
A_fp32 = torch.randn(M, K, device=device) B_fp32 = torch.randn(K, N, device=device)
Chuyển đổi sang FP8
A_fp8 = A_fp32.to(torch.float8_e4m3fnuz) B_fp8 = B_fp32.to(torch.float8_e4m3fnuz)
Tạo hệ số tỷ lệ (tỷ lệ đồng nhất)
A_scale = torch.ones(K // QUANT_SIZE, M, device=device, dtype=torch.float32) B_scale = torch.ones(K // QUANT_SIZE, N // QUANT_SIZE, device=device, dtype=torch.float32)
C = torch.zeros(M, N, device=device, dtype=torch.bfloat16)
Sử dụng kernel
result = gemm.gemm(A_fp8, B_fp8, A_scale, B_scale, C)
Đó là tất cả! Kernel ROCm của bạn giờ đây đã sẵn sàng để sử dụng từ Hugging Face Hub.
Kết luận
Xây dựng và chia sẻ kernel ROCm với Hugging Face giờ đây dễ dàng hơn bao giờ hết. Với quy trình làm việc sạch sẽ, có thể tái sản xuất được hỗ trợ bởi Nix và tích hợp liền mạch vào PyTorch, các nhà phát triển có thể tập trung vào việc tối ưu hóa hiệu suất thay vì thiết lập. Sau khi được xây dựng, kernel tùy chỉnh của bạn có thể được chia sẻ trên Hugging Face Hub; làm cho nó có thể truy cập ngay lập tức cho cộng đồng và có thể sử dụng trên các dự án chỉ với một vài dòng mã. 🚀
Thư viện & Hub liên quan
- kernel-builder – Xây dựng và biên dịch kernel tùy chỉnh.
- kernels – Thư viện để quản lý và tải kernel từ Hub.
- Kernels Community Hub – Chia sẻ và khám phá kernel từ cộng đồng.
Link bài viết gốc
- Tags:
- Ai
- 17 November 2025
- Huggingface.co