Nano Hash - криптовалюты, майнинг, программирование

cublas batched gemm throw не поддерживается ошибка с большим размером партии

Я вызываю API cublasGemmStridedBatchedEx(). У меня первая матрица работает с шагом, а вторая исправлена. Программа хорошо работает с небольшими входными данными, но выдает ошибку CUBLAS_STATUS_NOT_SUPPORTED с большим размером пакета.

Согласно документации cublas, это означает тип данных или алгоритм не поддерживается. Я не вижу, как увеличение размера пакета изменяет тип данных. Я использую эвристический алгоритм GEMM по умолчанию.

Я скомпилировал код с помощью CUDA9.2 и запустил его на карте GTX 1050.

Код:

#include <stdio.h>
#include <stdlib.h>

#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <cuda_fp16.h>

#include "nvidia_helper/checkCudaErrors.h"

int UPPER_BOUND = 4096;

int main() {
    half* F4_re;
    half* X_split;
    float* result1;

    int M = 16;
    int B = 256*64;

    checkCudaErrors(cudaMallocManaged((void **) &F4_re, 4 * 4 * sizeof(half)));
    checkCudaErrors(cudaMallocManaged((void **) &X_split, M * 4 * B * 4 * sizeof(half)));
    checkCudaErrors(cudaMallocManaged((void **) &result1, M * 4 * B * 4 * sizeof(float)));

    F4_re[0] = 1.0f;
    F4_re[1] = 1.0f;
    F4_re[2] = 1.0f;
    F4_re[3] = 1.0f;
    F4_re[4] = 1.0f;
    F4_re[5] = 0.0f;
    F4_re[6] =-1.0f;
    F4_re[7] = 0.0f;
    F4_re[8] = 1.0f;
    F4_re[9] =-1.0f;
    F4_re[10] = 1.0f;
    F4_re[11] =-1.0f;
    F4_re[12] = 1.0f;
    F4_re[13] = 0.0f;
    F4_re[14] =-1.0f;
    F4_re[15] = 0.0f;

    srand(time(NULL));
    for (int i = 0; i < M * 4 * B * 4; i++) {
       X_split[i] = (float)rand() / (float)(RAND_MAX) * 2 * UPPER_BOUND - UPPER_BOUND;
    }

    cublasStatus_t status;
    cublasHandle_t handle;
    float alpha = 1.0f, beta = 0.0f; 

    status = cublasCreate(&handle);
    if (status != CUBLAS_STATUS_SUCCESS) {
        fprintf(stderr, "!!!! CUBLAS initialization error\n");
        exit(1);
    }
    status = cublasSetMathMode(handle, CUBLAS_TENSOR_OP_MATH); // allow Tensor Core
    if (status != CUBLAS_STATUS_SUCCESS) {
        fprintf(stderr, "!!!! CUBLAS setting math mode error\n");
        exit(1);
    }

    long long int stride = M * 4;

    status = cublasGemmStridedBatchedEx(handle, CUBLAS_OP_N, CUBLAS_OP_N, M, 4, 4, &alpha, X_split,
             CUDA_R_16F, M, stride, F4_re, CUDA_R_16F, 4, 0, &beta, result1, CUDA_R_32F, M, stride, B * 4, CUDA_R_32F, CUBLAS_GEMM_DEFAULT);
    if (status != CUBLAS_STATUS_SUCCESS) {
        fprintf(stderr, "!!!! CUBLAS kernel execution error: %d .\n", status);
        exit(1);
    }

    status = cublasDestroy(handle);
    if (status != CUBLAS_STATUS_SUCCESS) {
        fprintf(stderr, "!!!! shutdown error (A)\n");
        exit(1);
    }

    checkCudaErrors(cudaFree(F4_re));
    checkCudaErrors(cudaFree(X_split));
    checkCudaErrors(cudaFree(result1));

    return 0;
}
24.07.2018

  • Вы должны предоставить минимальный воспроизводимый пример, см. пункт 1 здесь То, что вы предоставили, не является полным примером. 24.07.2018
  • @RobertCrovella Описание обновлено 24.07.2018
  • @XiaoheCheng Пожалуйста, добавьте информацию, при каких конкретных размерах матрицы код перестает работать. Этот пакетный API разработан для случая использования множества небольших матриц (которые было бы неэффективно обрабатывать с помощью классических вызовов API BLAS), и он может (предположение!) иметь ограничение на размер матрицы (возможно, максимальный размер около 150-200), который был случайно исключен из документации. 24.07.2018
  • @talonmies Я следил за описанием здесь: devblogs.nvidia.com/cublas-strided -пакетная-матрица-умножить. Вы можете выполнить поиск «дополнительные оптимизации», чтобы найти соответствующий контент. И это хорошо работает, если размер партии изменяется с B * 4 на B в приведенном выше коде. 24.07.2018
  • Согласно моему тестированию, предоставленный код не будет работать (возвращает код ошибки cublas 15 - CUBLAS_STATUS_NOT_SUPPORTED) с заданными размерами матрицы, если количество пакетов, переданное в cublasGemmStridedBatchedEx, равно 65535 или больше. Чтобы быть ясным, мое наблюдение: 65536 терпит неудачу, 65535 терпит неудачу, 65534 проходит. 24.07.2018
  • @RobertCrovella Кажется, нужно зарегистрировать ошибку. Либо ограничение предусмотрено дизайном, и в этом случае это ошибка документации, либо ограничение непреднамеренное, и в этом случае это ошибка реализации. 25.07.2018
  • Я уже сообщил о внутренней ошибке в NVIDIA. На данный момент у меня нет никакой дополнительной информации. 25.07.2018

Ответы:


1

Эта проблема должна быть исправлена ​​в только что выпущенном патче CUBLAS, который доступен здесь

Ищите этот патч:

Исправление 1 (выпущено 6 августа 2018 г.)

Это исправление, которое необходимо установить поверх правильной установки CUDA 9.2.148.

Сначала вы должны установить CUDA 9.2.148. Затем установите патч.

08.08.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..