Документация / РусскийИсходный текст ↗

ruBLAS Руководство пользователя

English | 简体中文 | 日本語 | Deutsch | Русский

Вычислительные библиотеки · Среда выполнения API · 中文

1. Обзор и возможности

ruBLAS предоставляет операции линейной алгебры и интерфейсы тензоров устройств.

Feature Модуль
tensor-vector rublas::tensor_vector
tensor-matmul rublas::tensor_matmul
tensor-matmul-autotune Автонастройка умножения тензорной матрицы
tensor-int4 rublas::tensor_int4
tensor-grouped rublas::tensor_grouped

Пакет Cargo — rublas. Выберите необходимые функции и отключите ненужные значения по умолчанию для путей общего назначения. См. Cargo.toml.

2. Умножение матриц, векторы и INT4

Умножение тензорной матрицы

rublas::tensor_matmul::matmul принимает lhs, rhs, необязательный выход out, MatmulStrategy и выходной DType. Возвращает тензор устройства или MatmulSetupError. Передайте существующий выход через out либо не задавайте его для выделения нового.

Стратегии включают Ruda, CmmaResidueFirst, Naive и Autotune при включённом tensor-matmul-autotune. Без этого feature по умолчанию используется Ruda, с ним — Autotune. Для квантованных входов Naive может после сбоя исходного пути деквантовать данные и выполнить вычисление; это не нативное вычисление INT4.

CmmaResidueFirst явно выбирает путь Tensor Core, который сначала обрабатывает частичный фрагмент K32, не требуя материализованной дополненной матрицы. lhs и rhs должны иметь совпадающие неквантованные BF16 или F16 dtype и совместимые размеры матрицы. Устройство должно поддерживать матричные инструкции пути. Эта функция возвращает вывод F32:

use ruda_core::tensor::DType;
use ruda_kernel::{dsl::Runtime, tensor::RudaTensor};
use rublas::{
    kernel_ir::definition::MatmulSetupError,
    tensor_matmul::{MatmulStrategy, matmul},
};

fn residue_matmul<R: Runtime>(
    lhs: RudaTensor<R>,
    rhs: RudaTensor<R>,
) -> Result<RudaTensor<R>, MatmulSetupError> {
    matmul(lhs, rhs, None, MatmulStrategy::CmmaResidueFirst, DType::F32)
}

Входы [M, K] и [K, N] создают [M, N]. Неверная настройка или отсутствие возможностей устройства возвращают MatmulSetupError вместо переключения на Naive.

См. точку входа умножения матрицы.

Векторное произведение

rublas::tensor_vector::cross(lhs, rhs, dim) требует длину 3 выбранного измерения и возвращает тензор устройства. Вычисление вдоль измерения, отличного от последнего, включает перестановку осей и преобразование в непрерывное размещение. См. cross.rs.

AWQ INT4

rublas::tensor_int4::AwqGemm::new использует qweight, qzeros, scales, дополнительные bias и group_size для построения упакованных весов. forward принимает входные данные F16 и возвращает выходные данные F16 или Int4Error.

Для входного измерения K, выходного измерения N и размера группы G:

Данные Тип данных Форма
qweight Упакованный I32 [K, N/8]
qzeros Упакованный I32 [K/G, N/8]
scales F16 [K/G, N]
bias (дополнительно) F16 [N]

K, N и G должны быть ненулевыми; K должен делиться на G и N на 8. Конечная размерность входных данных — K, заменяемая на N на выходе. Все операнды должны использовать общее устройство. Порядок упакованных битов должен соответствовать ядру AWQ; произвольный файл INT4 не может использоваться непосредственно как qweight.

См. Интерфейс INT4 для объекта и его проверок.

3. Групповое умножение матриц

rublas::tensor_grouped::grouped_matmul_nt<R: Runtime> принимает входные данные, веса и row_experts как значения RudaTensor<R>. Он возвращает Result<RudaTensor<R>, GroupedMatmulError>.

Аргумент Форма Требования
ввод [M, K] Неквантованный F32, F16 или BF16
веса [E, N, K] Те же dtype и устройство, что у входа
row_experts [M] Неквантованный U32 на том же устройстве
Вывод [M, N] Тот же dtype, что и для ввода.

Строка m выбирает матрицу весов, индексированную row_experts[m], и вычисляет скалярное произведение между входной строкой и каждой строкой этой матрицы. Последние два весовых измерения участвуют в транспонированной форме, не требуя материализованного транспонирования.

4. Семантика группового умножения

Источник: сгруппированный интерфейс и ядро.

5. Интеграция с другими библиотеками

ruDNN MoE использует групповое умножение для экспертных прогнозов. Квантованные веса используют отдельный модуль tensor_int4; обычное групповое умножение с плавающей запятой не является экспертным вычислением INT4.

grouped_matmul_nt использует скалярное накопление. Измеряйте стратегии умножения матриц для своего dtype, формы и бэкенда.

6. Сегментированное умножение матриц экспертов

При включённом tensor-grouped функция rublas::tensor_grouped::grouped_matmul_nt_segmented(input, weights, row_experts, offsets, strategy) добавляет к существующему групповому интерфейсу сегменты экспертов на устройстве. Input имеет форму [M, K], weights — [E, N, K], row_experts — U32 [M], offsets — U32 [E + 1]; результат — [M, N] с dtype входа. Операнды должны быть неквантованными и использовать одно устройство и одну очередь исполнения.

Это unsafe Rust API: offsets должен быть неубывающим эксклюзивным префиксом, начинающимся с 0 и заканчивающимся M, а каждая строка в [offsets[e], offsets[e + 1]) должна принадлежать эксперту e. row_experts должен описывать то же неизменяемое распределение. Проверки форм не проверяют эти значения на устройстве.

GroupedStrategy::Scalar использует существующее скалярное ядро. TensorCore явно требует совпадающих входов F16/BF16, поддержки кооперативных матричных операций 16×16×16, plane из 32 линий, достаточной общей памяти и допустимой сетки запуска; неподдерживаемая конфигурация возвращает GroupedMatmulError. Ядро накапливает в FP32 и обрабатывает неполные тайлы. Auto выбирает этот путь при наличии поддержки, иначе — скалярное ядро. Ошибки компиляции, запуска или численных вычислений не являются условиями перехода на запасной путь.

Для безопасного входа MoE с внутренним построением offsets используйте rudnn::moe::SwiGluExperts::forward_dispatched_with_strategy. Существующий forward_dispatched по умолчанию остаётся скалярным.

7. Сегментированный обратный проход

grouped_matmul_nt_backward_segmented(input, weights, grad_output, row_experts, offsets) возвращает GroupedBackward { dinput, dweights }. Формы: input [M, K], weights [E, N, K], grad_output [M, N]; dtype F32/F16/BF16, устройство и очередь должны совпадать. dinput сохраняет dtype входа; dweights имеет FP32 и форму [E, N, K]. Пустые сегменты экспертов получают нулевые градиенты весов. Идентификаторы строк и offsets соблюдают те же U32-форматы и неизменяемые префиксные инварианты, что и прямой проход. Это unsafe API без чтения метаданных устройства на хост для проверки.

Стандартная обёртка выбирает GroupedStrategy::Scalar. grouped_matmul_nt_backward_segmented_with_strategy(..., strategy) независимо от прямого прохода выбирает Scalar, Auto или TensorCore. Кооперативный путь использует тайлы 16×16×16, FP32-накопление и FP32-градиенты весов; нужны поддерживаемое F16/BF16-оборудование и допустимая сетка запуска. TensorCore сообщает об отсутствии поддержки ошибкой; Auto переключается только при отсутствии возможностей, но не при ошибках компиляции или выполнения. Возможны копии для непрерывного размещения входов. Разный порядок редукции не гарантирует побитового совпадения.

Безопасный путь обучения экспертов: rudnn::moe::SwiGluExperts::forward_dispatched_training, затем ExpertTrainingCache::backward_with_strategy.