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
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

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-builderkernels 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 đó ab là các ma trận đầu vào, a_scaleb_scale là các hệ số tỷ lệ cho ab tương ứng, và c là ma trận đầu ra:

  • a là K × M ở định dạng e4m3fnuz
  • b là K × N ở định dạng e4m3fnuz
  • a_scale là (K // 128) × M ở định dạng fp32
  • b_scale là (K // 128) × (N // 128) ở định dạng fp32
  • c là 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-builderkernels để 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 .h cho 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 .hip cho 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.htranspose_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:

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.nixflake.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.

Recommended for You

Building for an Open Future - our new partnership with Google Cloud

Building for an Open Future - our new partnership with Google Cloud

Xây dựng cho Tương lai Mở - quan hệ đối tác mới của chúng tôi với Google Cloud

Gợi ý hiệu quả cho các mô hình thị giác sinh

Gợi ý hiệu quả cho các mô hình thị giác sinh

Không có mô tả