Исходный код NCCL 1: Подробное объяснение случаев использования официального веб-сайта, случаев использования/вызова одного процесса и одного устройства.
Исходный код NCCL 1: Подробное объяснение случаев использования официального веб-сайта, случаев использования/вызова одного процесса и одного устройства.

Интерпретация исходного кода этапов использования/вызова NCCL (в качестве примера одно устройство и один процесс):

Краткое описание шагов:

Получить количество локальных рангов (можно понимать как процессов) через MPI, localrank, который используется для привязки ранга к графическому процессору;

Rank0 получает идентификатор группы связи NCCL и передает его другим рангам через MPI_Bcast;

С помощью этой информации, полученной MPI, NCCL завершает инициализацию и осуществляет коллективную связь.

Основные шаги:

1. Инициализируйте и запустите связь MPI.

2. Вычислить хэш-значение имени хоста и связаться с MPI_allgather, чтобы каждый ранг (процесс) получил хеш-значение других рангов.

3. На основании полученного значения хеш-функции сравнить общее количество рангов localrank, с которыми участвует в общении хост, на котором расположен ранг (ранги с одинаковым значением хеш-функции находятся на одном хосте). (Хеш-значение — это имя хоста. Фактически, по имени хоста можно получить общее количество рангов, участвующих в общении на хосте. Однако имена хостов разнообразны, и хеш-значение легче сравнивать)

4. Получите уникальный идентификатор NCCL на ранге 0 и передайте его другим рангам с помощью MPI_Bcast. (Этот уникальный идентификатор используется для идентификации группы связи, поэтому все ранги в группе связи имеют одинаковый идентификатор)

5. Привяжите графический процессор на основе локального ранга, выделите буферы отправки и приема и создайте поток CUDA.

6. Инициализируйте коммуникатор NCCL.

7. nccl allreduce общение. Синхронизируйте потоки CUDA, чтобы обеспечить завершение связи.

8. Освободите буфер.

9. Уничтожить коммуникатор.

10. Завершите работу среды MPI

Видеоурок

Ха-ха-ха,Я считаю, что нет необходимости снимать видео по этому вопросу.,Если необходимо продолжить, обновите его на станции B.

1.1 Подробное объяснение исходного кода на официальном сайте NCCL Одно устройство на процесс или Thread_bilibili_bilibili

Соответствующий исходный код

Язык кода:javascript
копировать
int main(int argc, char* argv[])  

{  

  // Определите целочисленную переменную size, которая представляет размер буфера 32 МБ.  
  int size = 32*1024*1024;  

  // Определите переменные, связанные с MPI, включая рейтинг текущего процесса (myRank), общее количество процессов (nRanks) и локальный рейтинг (localRank).  
  int myRank, nRanks, localRank = 0;  

  

  //////// 1. Инициализируйте и запустите связь MPI ///////////////////
  MPICHECK(MPI_Init(&argc, &argv));  

  // Получить рейтинг текущего процесса  
  MPICHECK(MPI_Comm_rank(MPI_COMM_WORLD, &myRank));  
  // Получить общее количество процессов  

  MPICHECK(MPI_Comm_size(MPI_COMM_WORLD, &nRanks));  

  
  ///////// 2. Вычислить хэш-значение имени хоста и связаться с MPI_allgather, чтобы каждый ранг (процесс) получил хеш-значение других рангов.////////////////
  // Вычисление localRank на основе хеша имени хоста для выбора графического процессора  
  uint64_t hostHashs[nRanks];  
  char hostname[1024];  
  getHostName(hostname, 1024); // Получить имя хоста  
  hostHashs[myRank] = getHostHash(hostname); // Вычислить хэш-значение имени хоста  

  // Используйте MPI_Allgather для сбора хешей всех процессов.  
  MPICHECK(MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, hostHashs, sizeof(uint64_t), MPI_BYTE, MPI_COMM_WORLD));  

  
  /////////////////3. На основании полученного значения хеш-функции подсчитать общее количество рангов, в общении которых участвует хост, на котором расположен ранг (ранги с одинаковым значением хеш-функции). находятся на одном хосте). (Хеш-значение — это имя хоста. Фактически, по имени хоста можно получить общее количество рангов, участвующих в общении на хосте. Однако имена хостов разнообразны и хэш-значения легче сравнивать) /////////////// ////////
  // Вычислите localRank, который представляет собой количество процессов с одинаковым хешем хоста (исключая текущий процесс).  
  for (int p=0; p<nRanks; p++) {  

     if (p == myRank) break; // Если это текущий процесс, выйдите из цикла  

     if (hostHashs[p] == hostHashs[myRank]) localRank++; // Если хеши одинаковые, localRank увеличивается на 1.  

  }  

  

  // Переменные, связанные с NCCL, включая уникальный идентификатор (id) и коммуникатор (comm)  

  ncclUniqueId id;  

  ncclComm_t comm;  

  // Определите переменные, связанные с CUDA, включая буферы отправки и получения (sendbuff, Recvbuff) и поток(и) CUDA  

  float *sendbuff, *recvbuff;  

  cudaStream_t s;  

  
  ///////////////////4. Получите уникальный идентификатор NCCL на ранге 0 и передайте его другим рангам с помощью MPI_Bcast. (Этот уникальный идентификатор используется для идентификации группы связи, поэтому все ранги в группе связи имеют одинаковый идентификатор)////////////
  // в ранге Получите уникальный идентификатор NCCL со значением 0 и передайте его всем остальным процессам с помощью MPI_Bcast.  
  if (myRank == 0) ncclGetUniqueId(&id);  
  MPICHECK(MPI_Bcast((void *)&id, sizeof(id), MPI_BYTE, 0, MPI_COMM_WORLD));  

  
  ////////////////5. Привяжите графический процессор на основе локального ранга, выделите буферы отправки и приема и создайте поток CUDA.////////////
  // Выберите графический процессор на основе localRank и выделите буферы устройства.  
  // CUDACHECK — это макрос, используемый для проверки возвращаемого значения функции CUDA.  

  CUDACHECK(cudaSetDevice(localRank)); // Настройка устройства CUDA  

  CUDACHECK(cudaMalloc(&sendbuff, size * sizeof(float))); // Выделить буфер отправки  

  CUDACHECK(cudaMalloc(&recvbuff, size * sizeof(float))); // Выделить буфер приема  

  CUDACHECK(cudaStreamCreate(&s)); // Создать поток CUDA  

  

  /////////////6. Инициализация коммуникатора NCCL///////////////////////////  

  NCCLCHECK(ncclCommInitRank(&comm, nRanks, id, myRank));  

  

  //////////7. Используйте NCCL для операций AllReduce. //////////////////////

  // Эта операция суммирует значения в sendbuff по всем процессам и помещает результат в Recvbuff.  

  NCCLCHECK(ncclAllReduce((const void*)sendbuff, (void*)recvbuff, size / sizeof(float), ncclFloat, ncclSum, comm, s));  

  // Примечание: размер / sizeof(float) Это потому, что ncclAllReduce требует количества элементов, а не количества байтов.  

  

  // Синхронизируйте потоки CUDA, чтобы обеспечить завершение операций NCCL.  

  CUDACHECK(cudaStreamSynchronize(s));  

  

  ///////////////8. Освободите буфер устройства////////////////  

  CUDACHECK(cudaFree(sendbuff));  

  CUDACHECK(cudaFree(recvbuff));  

  

  ////////////// 9. Уничтожить коммуникатор NCCL ///////////////////  

  ncclCommDestroy(comm);  

  

  ///////////////10、 Завершить среду MPI ///////////////////// 

  MPICHECK(MPI_Finalize());


  printf("[MPI Rank %d] Success \n", myRank);
  return 0;
}

Источник исходного кода Официальный документ NCCL Example 2: One Device per Process or Thread:Examples — NCCL 2.21.5 documentation (nvidia.com)

Предварительный просмотр следующего выпуска:

NCCLИнтерпретация исходного кода2:ncclGetUniqueId(&id)функция Интерпретация исходного кода

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода