English 中文 Español Deutsch 日本語 Português
preview
Добавляем пользовательскую LLM в торгового робота (Часть 4): Обучение собственной LLM с помощью GPU

Добавляем пользовательскую LLM в торгового робота (Часть 4): Обучение собственной LLM с помощью GPU

MetaTrader 5Трейдинг | 13 декабря 2024, 12:38
684 0
Yuqiang Pan
Yuqiang Pan

Содержание:



Введение

В предыдущей статье мы кратко обсудили, как создавать наборы данных для больших языковых моделей, и продемонстрировали, как обучить языковую модель, используя только центральный процессор (CPU), на простом примере. Однако мы не тестировали модель, поскольку это была всего лишь предварительно обученная модель. В этой статье мы продолжим обсуждение обучения моделей, на этот раз с использованием графических процессоров (GPU). Обратите внимание - пример исключительно демонстрационный. Модель все еще недостаточно мощная, поэтому в этой статье мы не будем рассматривать ее тестирование. Тестирование будет рассмотрено в последующих статьях.  

Ранее, во второй части серии, мы рассматривали настройку сред ускорения CUDA. Теперь мы сосредоточимся на использовании видеокарт AMD для ускорения обучения, что послужит дополнением к предыдущей статье. В настоящее время настройка среды для видеокарт NVIDIA относительно проста, в то время как настройка среды для карт AMD может представлять определенные трудности. В этой статье мы рассмотрим решения распространенных проблем, которые позволят вам плавно ускорить обучение собственной модели финансового языка с использованием видеокарт AMD. Если вы используете видеокарты NVIDIA, не волнуйтесь — методы обучения те же. Если вы уже настроили среду CUDA, вы можете следовать инструкциям по обучению, приведенным в этой статье, не сосредотачиваясь на конкретных этапах настройки для видеокарт AMD.  

 


Подготовка

В предыдущей статье этой серии мы рассмотрели настройку сред NVIDIA. Однако не стоит упускать из виду тот факт, что некоторые пользователи работают с оборудованием AMD. Поэтому мы также обсудим настройку среды ускоренных вычислений ROCm (Radeon Open Compute). На данный момент не существует версии PyTorch для Windows, поддерживающей ROCm. WSL (подсистема Windows для Linux) также пока не поддерживает ROCm. Поэтому если вы хотите использовать ROCm для обучения больших моделей, Linux (в частности, Ubuntu) в настоящее время является приемлемым вариантом (положительным моментом является то, что в следующем выпуске ROCm может быть добавлена поддержка WSL в будущем, но на данный момент последняя версия — 6.1.2, и я не думаю, что первая поддерживаемая версия будет оптимальной). В ходе использования я столкнулся с несколькими проблемами, связанными с оборудованием AMD, с которыми не сталкивался при работе с NVIDIA. Я поделюсь некоторыми решениями, которые, по моему мнению, могут быть полезны пользователям AMD. Хоть это и может быть немного обременительно, но помните, что мы экономим деньги, верно? )   

Итак, если вы хотите ускорить обучение больших языковых моделей с использованием видеокарт AMD, вот необходимые подготовительные шаги:     

1. Установка Ubuntu  

Вам потребуется установить Ubuntu. Рекомендуется настроить систему с загрузкой Windows и Ubuntu на одном ПК. Нам может потребоваться доступ к данным из системы Windows, поэтому полезно иметь обе ОС. Подробные руководства по настройке системы с двойной загрузкой широко доступны в Интернете. Кроме того, вы можете развернуть свое устройство AMD как удаленный хост Ubuntu и использовать его как удаленную среду разработки. Затем вы можете подключиться к удаленному хосту через SSH из вашей системы Windows. Этот подход аналогичен использованию WSL в Windows, но ключевым отличием является то, что видеокарты AMD не поддерживают WSL. Я спросил об этом разработчиков ROCm, и они ответили, что поддержка WSL в настоящее время находится в стадии разработки (возможно, будет доступна в следующей версии). Однако имейте в виду, что для этого решения вам может потребоваться несколько компьютеров. Лично я пользуюсь этим методом.  

2. Проверка конфигурации оборудования 

Будьте осторожны при выборе конфигурации оборудования. Например, я столкнулся с частыми сбоями драйверов моей видеокарты 7900XTX. Изначально я использовал блок питания мощностью 850 Вт, чего должно было быть достаточно для одного графического процессора. Однако я не учел, что сбои драйверов могут быть связаны с проблемами электропитания. После безуспешных попыток решить проблему друг посоветовал перейти на блок питания мощностью 1250 Вт, и все заработало как надо.

Итак, искренний совет всем пользователям оборудования AMD - убедитесь, что ваш блок питания может работать с вашими устройствами.  

3. ROCM и HIP   

Если вы предпочитаете менее сложную настройку среды, вы можете использовать официальный образ Docker от AMD. Просто скачайте официальный образ контейнера ROCm с помощью Docker. Большинство необходимых конфигураций среды уже настроены в образе Docker, поэтому я рекомендую этот подход.

4. Настройки оборудования

Во время использования устройства я заметил, что оптимизация драйвера AMDGPU под Ubuntu не так хороша. Возьмем в качестве примера мою 7900XTX: хотя она может выдавать мощность 350 Вт, предел по умолчанию установлен на уровне 303 Вт. Кроме того, даже при полной нагрузке скорость вращения вентилятора составляла менее 45%, а температура ядра оставалась на уровне 100°C. При реальном обучении большой модели, которое может продолжаться непрерывно в течение нескольких часов или даже дней, поддержание столь высоких температур опасно для устройства.  

Чувствуете, что пора сменить устройство? Поверьте мне, это еще не всё…  


Конфигурация оборудования

1. Настройка драйверов

На данный момент драйвер amdgpu в Ubuntu предоставляет некоторые внешние интерфейсы для настроек GPU. Файлы конфигурации находятся в "/sys/class/drm/card0/device/hwmon/hwmon2/". Вместо "hwmon2" может быть "hwmon1" или другое значение. Настройте его в соответствии с особенностями вашего устройства. Я рекомендую отрегулировать скорость вращения вентилятора и мощность, но не изменять другие настройки.  

Давайте посмотрим, как настроить скорость вентилятора. Для этих файловых операций требуются права администратора, в противном случае вы не сможете вносить изменения. Я рекомендую использовать пользователя root (суперпользователя) для внесения изменений:    

  • Сначала включите pwm1:echo "1" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable
  • Примените настройку: echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable

Установите скорость вентилятора на 128. Значение может находиться в диапазоне от 0 до 255, где 255 - максимальная скорость вентилятора.

  • Настройте ее в соответствии с вашими потребностями: echo "128" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
  • Примените настройку: echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1     

Отрегулируйте предел мощности, например, если максимальная мощность вашего 7900XTX составляет 350 Вт, а по умолчанию она составляет 303 Вт:

  • Измените его на 330 Вт: echo "330000000" > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap
  • Применить настройку: echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap   

Примечание:   

1. Чтобы отменить настройки, используйте echo "r" > и соответствующий путь (например, echo "r" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable).  

2. Избегайте одновременной настройки скорости вращения вентилятора через интерфейсы "pwm1" и "fan[1-*]_target", так как последний переопределит первый.     

2. Настройки ROCM-SMI

Ниже приведены часто используемые команды для rocm-smi: 

usage: rocm-smi [-h] [-V] [-d DEVICE [DEVICE ...]] [--alldevices] [--showhw] [-a] [-i] [-v] [-e [EVENT ...]]
                [--showdriverversion] [--showtempgraph] [--showfwinfo [BLOCK ...]] [--showmclkrange] [--showmemvendor]
                [--showsclkrange] [--showproductname] [--showserial] [--showuniqueid] [--showvoltagerange] [--showbus]
                [--showpagesinfo] [--showpendingpages] [--showretiredpages] [--showunreservablepages] [-f] [-P] [-t]
                [-u] [--showmemuse] [--showvoltage] [-b] [-c] [-g] [-l] [-M] [-m] [-o] [-p] [-S] [-s]
                [--showmeminfo TYPE [TYPE ...]] [--showpids [VERBOSE]] [--showpidgpus [SHOWPIDGPUS ...]]
                [--showreplaycount] [--showrasinfo [SHOWRASINFO ...]] [--showvc] [--showxgmierr] [--showtopo]
                [--showtopoaccess] [--showtopoweight] [--showtopohops] [--showtopotype] [--showtoponuma]
                [--showenergycounter] [--shownodesbw] [--showcomputepartition] [--showmemorypartition] [-r]
                [--resetfans] [--resetprofile] [--resetpoweroverdrive] [--resetxgmierr] [--resetperfdeterminism]
                [--resetcomputepartition] [--resetmemorypartition] [--setclock TYPE LEVEL] [--setsclk LEVEL [LEVEL ...]]
                [--setmclk LEVEL [LEVEL ...]] [--setpcie LEVEL [LEVEL ...]] [--setslevel SCLKLEVEL SCLK SVOLT]
                [--setmlevel MCLKLEVEL MCLK MVOLT] [--setvc POINT SCLK SVOLT] [--setsrange SCLKMIN SCLKMAX]
                [--setextremum min|max sclk|mclk CLK] [--setmrange MCLKMIN MCLKMAX] [--setfan LEVEL]
                [--setperflevel LEVEL] [--setoverdrive %] [--setmemoverdrive %] [--setpoweroverdrive WATTS]
                [--setprofile SETPROFILE] [--setperfdeterminism SCLK]
                [--setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx}]
                [--setmemorypartition {NPS1,NPS2,NPS4,NPS8,nps1,nps2,nps4,nps8}] [--rasenable BLOCK ERRTYPE]
                [--rasdisable BLOCK ERRTYPE] [--rasinject BLOCK] [--gpureset] [--load FILE | --save FILE]
                [--autorespond RESPONSE] [--loglevel LEVEL] [--json] [--csv]

Установим параметры:
  --setclock TYPE LEVEL                            Уровень (уровни) тактовой частоты (требуется ручной уровень Perf)
  --setsclk LEVEL [LEVEL ...]                      Уровень (уровни) тактовой частоты GPU (требуется ручной уровень Perf)
  --setmclk LEVEL [LEVEL ...]                     Уровень (уровни) тактовой частоты памяти GPU (требуется ручной уровень Perf)
  --setpcie LEVEL [LEVEL ...]                     Уровень (уровни) тактовой частоты PCIE (требуется ручной уровень Perf)
  --setslevel SCLKLEVEL SCLK SVOLT          Тактовая частота (МГц) и напряжение (мВ) GPU для определенного уровня
  --setmlevel MCLKLEVEL MCLK MVOLT       Тактовая частота (МГц) и напряжение (мВ) памяти GPU для определенного уровня
  --setvc POINT SCLK SVOLT                      Кривая напряжения SCLK (МГц мВ) для определенной точки
  --setsrange SCLKMIN SCLKMAX                 Минимальная и максимальная скорость SCLK
  --setextremum min|max sclk|mclk CLK    Минимальная и максимальная скорость SCLK/MCLK
  --setmrange MCLKMIN MCLKMAX              Минимальная и максимальная скорость MCLK
  --setfan LEVEL                                        Скорость вращения вентилятора GPU (уровень или %)
  --setperflevel LEVEL                                Уровень производительности
  --setoverdrive %                                      Упровень GPU OverDrive (требуется ручной режим|высокий уровень Perf)
  --setmemoverdrive %                               Уровень разгона памяти GPU OverDrive (требуется ручной режим|высокий уровень Perf)
  --setpoweroverdrive WATTS                     Максимальная мощность GPU, установленная с помощью Power OverDrive в ваттах
  --setprofile SETPROFILE                          Уолвень профиля мощности (#) или строка в кавычках с атрибутами пользовательского (CUSTOM) профиля "# # # #..." (требуется ручной уровень Perf)

  --setperfdeterminism SCLK                     Ограничение тактовой частоты для получения минимального изменения производительности

  --setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx}  Вычислительный раздел
  --setmemorypartition {NPS1,NPS2,NPS4,NPS8,nps1,nps2,nps4,nps8}   Раздел памяти
  --rasenable BLOCK ERRTYPE                   Включить RAS для указанного блока и типа ошибки
  --rasdisable BLOCK ERRTYPE                  Отключить RAS для указанного блока и типа ошибки
  --rasinject BLOCK                                   Внедрить RAS poison для указанного блока (работает только на незащищенных платах!)

Сброс параметров:
  -r, --resetclocks                                               Сброс тактовых частот и OverDrive на значения по умолчанию
  --resetfans                                                      Сброс вентиляторов в режим автоматического (драйверного) управления
  --resetprofile                                                   Сброс профиля питания до значений по умолчанию
  --resetpoweroverdrive                                     Установить максимальную мощность GPU в значение по умолчанию
  --resetxgmierr                                                 Сброс счетчика ошибок XGMI
  --resetperfdeterminism                                   Отключение настройки производительности
  --resetcomputepartition                                  Сброс до состояния раздела загрузочных вычислений
  --resetmemorypartition                                   Сброс до состояния раздела загрузочной памяти

Параметры автоответа:
  --autorespond RESPONSE                            Ответ на автоматическое предоставление всех запросов (не рекомендуется!)

Параметры вывода:
  --loglevel LEVEL                                            Какой объем данных будет выведен для выполняемой программой работы (debug/info/warning/error/critical)
  --json                                                            Вывод в формате JSON
  --csv                                                             Вывод в формате CSV

         

3. Настройки AMD-SMI

Исходя из текущего направления развития ROCm, вполне возможно, что amd-smi заменит rocm-smi. Ниже приведены часто используемые команды для amd-smi: 

usage: amd-smi set [-h] -g GPU [GPU ...] [-f %] [-l LEVEL] [-P SETPROFILE] [-d SCLKMAX]
                   [-C PARTITION] [-M PARTITION] [-o WATTS] [-p POLICY_ID] [-x POLICY_ID]
                   [--json | --csv] [--file FILE] [--loglevel LEVEL]

Для настройки конфигурации необходимо указать GPU.                                    
Необходимо указать позиционный аргумент (set). Допускается несколько позиционных аргументов.

Позиционные аргументы:
  -h, --help                                         Показать справочное сообщение и выйти
  -g, --gpu GPU [GPU ...]                     Выбрать GPU ID, BDF или UUID из возможных вариантов
  -f, --fan %                                        Скорость вращения вентилятора GPU (0-255 или 0-100%)
  -l, --perf-level LEVEL                       Уровень производительности
  -P, --profile SETPROFILE                   Уровень профиля питания (#) или строка в кавычках с атрибутами настраиваемого профиля
  -d, --perf-determinism SCLKMAX      Установить предел тактовой частоты GPU и уровень производительности на determinism, чтобы получить минимальные колебания производительности
  -C, --compute-partition PARTITION   Установить один из следующих режимов раздела вычислений: CPX, SPX, DPX, TPX, QPX
  -M, --memory-partition PARTITION    Установить один из следующих режимов раздела памяти: NPS1, NPS2, NPS4, NPS8
  -o, --power-cap WATTS                     Установить предел мощности
  -p, --dpm-policy POLICY_ID              Установить политику GPU DPM, используя policy id
  -x, --xgmi-plpd POLICY_ID                Установить политику отключения питания GPU XGMI для каждого канала с использованием policy id

Модификаторы команд:
  --json                             Вывод в формате JSON (по умолчанию удобный для восприятия человеком).
  --csv                              Вывод в формате CSV (по умолчанию удобный для восприятия человеком).
  --file FILE                      Сохранить вывод в файл по указанному пути (по умолчанию stdout).
  --loglevel LEVEL             Установить уровень журналирования из возможных вариантов: DEBUG, INFO, WARNING, ERROR, CRITICAL

  

Примечание:  

Стоит отметить, что некоторые настройки не работают при использовании amd-smi, но успешно работают с rocm-smi. Например: sudo amd-smi set -g 0 -f 90% failed: "ValueError: Unable to set fan speed 229 on GPU ID: 0 BDF:0000:03:00.0". В таких случаях переключитесь на rocm-smi: sudo rocm-smi --setfan 90%. Всё работает!


4. Программное обеспечение для работы с настройками оборудования

В Ubuntu также доступны инструменты управления на основе пользовательского интерфейса. В этой статье мы не будем подробно на них останавливаться. Заинтересованные пользователи могут изучить следующие варианты:  

LACT: https://github.com/ilya-zlobintsev/LACT

radeon-profile: https://github.com/marazmista/radeon-profile


Среда разработки

После настройки оборудования вам необходимо настроить среду в вашей системе для ускорения GPU. Давайте продолжим использовать в качестве примера устройства AMD:

  • Поддержка драйверов для ускоренных вычислений: Необходимо установить драйвер amdgpu DKMS и ROCm HIP SDK.
  • Для библиотек Python, поддерживающих ускоренные вычисления: PyTorch, скомпилированный с помощью ROCm. Если вам требуется квантование для моделей, рассмотрите возможность использования (скомпилированный с помощью ROCm). Для ускоренных вычислений вам могут понадобиться flash-attention и triton (оба скомпилированы с помощью ROCm). Во время тестирования выводов вы можете использовать vllm. В нашем примере достаточно установить PyTorch.

1. Установка драйверов и зависимостей

Проверьте, поддерживаются ли ваше оборудование и система последней версией ROCm. Если нет, изучите более ранние версии ROCm. Если ни одна версия не поддерживает ваше устройство, поздравляем — вы наконец-то избавились от мучений с AMD! Рассмотрите другие бренды. Если ваше устройство поддерживает ROCm, у вас есть два варианта: развернуть среду с помощью Docker или установить непосредственно на локальном хосте. Действия одинаковы как при локальной установке, так и при установке в контейнере Docker. Однако я настоятельно рекомендую использовать Docker. Если вы допустили ошибки во время работы, вы можете просто удалить контейнер и запустить новый из уже извлеченного образа Ubuntu — переустанавливать систему не нужно! Поэтому в данной статье основное внимание уделяется развертыванию среды разработки с использованием Docker. При установке Docker используйте Docker Engine (а не Docker Desktop). Ознакомьтесь с руководством по установке: https://docs.docker.com/engine/install.


2. Извлечение базового образа

Извлеките базовый образ Ubuntu 22.04: docker pull ubuntu:22.04  

Примечание:

Если вы предпочитаете ненастраиваемое развертывание, извлеките образ ROCm/PyTorch напрямую: docker pull rocm/pytorch:latest.

Затем запустите контейнер:

docker run -it --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
		--device=/dev/kfd --device=/dev/dri --group-add video \
		--ipc=host --network=host --shm-size 8G rocm/pytorch:latest

Внутри контейнера Docker большинство сред разработки уже настроены. Вы можете либо скопировать llm.c в контейнер, либо клонировать его из официального репозитория с помощью Git. Затем переходите непосредственно к разделу обучения модели. Однако если вы столкнетесь с необычными проблемами, могут возникнуть проблемы с их устранением. Поэтому я рекомендую выполнять развертывание поэтапно, чтобы вы всегда знали, где найти решение.

3. Создание контейнера

Выполните следующую команду, чтобы создать контейнер (при желании можно выбрать другое имя):

docker run -it --name llmc --cap-add=SYS_PTRACE --ipc=host --network=host \
		--security-opt seccomp=unconfined --device=/dev/kfd --device=/dev/dri --group-add video ubuntu:22.04  

Примечание:

"--name llmc" опционален, он присваивает созданному контейнеру имя "llmc". Если вы пропустите этот параметр, контейнер будет иметь случайное имя. Я рекомендую использовать --network=host для упрощения сетевого доступа из контейнера к хосту. В противном случае сетевой режим по умолчанию — мостовой (bridged), что усложняет сетевой доступ контейнера к хосту (например, доступ к сетевому прокси-серверу хоста). "--ipc=host" позволяет контейнеру использовать память совместно с хостом, что повышает эффективность. Однако это снижает безопасность. Используйте его в зависимости от ваших потребностей. 


4. Установка драйвера и настройка ROCm    

Установить необходимые программные зависимости. При установке на хосте добавьте к командам префикс sudo:

apt install wget

apt install gpg

Настройте репозиторий amdgpu APT:

wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | tee /etc/apt/keyrings/rocm.gpg > /dev/null  

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amdgpu/6.1.1/ubuntu jammy main" \    | tee /etc/apt/sources.list.d/amdgpu.list  

apt update  

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/6.1.1 jammy main" \    | tee --append /etc/apt/sources.list.d/rocm.list  

echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' \    | tee /etc/apt/preferences.d/rocm-pin-600  

apt update  

Установите драйвер amdgpu: 

apt install amdgpu-dkms

При установке на локальный хост перезагрузите систему:  reboot.

Установите ROCm (я выбрал rocm-hip-sdk):  

apt install rocm-hip-sdk

Конечно, есть и другие варианты:  

  • rocm - все основные пакеты, инструменты и библиотеки ROCm.
  • rocm-language-runtime - среда выполнения ROCm runtime.
  • rocm-developer-tools - отладка и профилирование приложений HIP.
  • rocm-hip-runtime - запуск приложений HIP, написанных для платформы AMD.
  • rocm-hip-runtime-devel - разработка приложений на HIP или портирование из CUDA.
  • rocm-opencl-runtime - запуск приложений на базе OpenCL на платформе AMD.
  • rocm-opencl-sdk - разработка приложений на базе OpenCL для платформы AMD.
  • rocm-hip-libraries - библиотеки HIP, оптимизированные для платформы AMD.
  • rocm-hip-sdk - разработка или портирование приложений и библиотек HIP для платформы AMD.
  • rocm-ml-libraries - ключевые библиотеки машинного обучения. Включает MIOpen.
  • rocm-ml-sdk - разработка и запуск приложений машинного обучения для AMD.
  • rocm-openmp-runtime - запуск приложений на базе OpenMP на платформе AMD.
  • rocm-openmp-sdk - разработка приложений на основе OpenMP для программного обеспечения AMD.

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

tee --append /etc/ld.so.conf.d/rocm.conf <<EOF

/opt/rocm/lib/opt/rocm/lib64EOF  

ldconfig

Проверьте статус DKMS:

dkms status

Добавьте двоичные пути в переменную среды PATH:

export PATH=$PATH:/opt/rocm-6.1.1/bin

Проверьте установку: /opt/rocm-6.1.1/bin/rocminfo  /opt/rocm-6.1.1/bin/clinfo  

5. Установка PyTorch

Если Python не установлен, используйте apt для его установки или настройте среду Conda (Miniconda): apt install libjpeg-dev python3-dev python3-pip  

Проверьте, поддерживается ли ваша версия ROCm на официальном сайте PyTorch. На данный момент официальный релиз не поддерживает ROCm 6.1.1, поэтому установим предварительную версию:  

pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1/ 

torch

Если ваша версия ROCm ниже официально поддерживаемой, скорректируйте команду установки соответствующим образом. Например, если официальная команда релиза выглядит так: pip3 install torch --index-url https://download.pytorch.org/whl/rocm6.0, а ваша версия ROCm - "5.7.*", вы можете выполнить установку следующим образом:  

pip3 install torch --index-url https://download.pytorch.org/whl/rocm5.7


Если вы столкнулись с ошибкой "NameError: name ‘amdsmi’ is not defined" это говорит о том, что более новые версии Torch требуют поддержки Python для amdsmi. К сожалению, напрямую использовать pip не получится. Вам нужно будет собрать и установить его локально. Перейдите в /opt/rocm/share/amd_smi and install amd-smi-lib:  

apt install amd-smi-lib  

Если вы устанавливаете версию Python по умолчанию на хосте:  

python3 -m pip install --user . 

Если вы столкнулись с ошибкой разрешения, например:  

error: Cannot update time stamp of directory 'amdsmi.egg-info'  

error: could not create 'amdsmi.egg-info': Permission denied  

Выполните следующую команду с правами root:  

sudo python3 -m pip install --user .  

Если Python3 не найден, используйте:  

sudo -H python3 -m pip install --user .  

Если вы используете среду Conda (например, с именем «train_llm»), выполните установку следующим образом:  

sudo /home/deeper/miniconda/envs/train_llm/bin/python -m pip install . 

Замените путь на путь Python вашей виртуальной среды.

Наконец, повторите попытку:  

pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1/

  

Обучение модели

Как и в предыдущей статье, мы продолжим использовать проект с открытым исходным кодом "llm.c". Лично я считаю этот проект превосходным — логика кода ясна, а комментарии подробны, что облегчает чтение. Заинтересованные читатели могут изучить весь исходный код проекта, чтобы получить четкое представление обо всем процессе обучения больших языковых моделей. Я не буду здесь повторно приводить код для каждого шага обучения, комментарии в исходном коде и так достаточно подробны.  

Чтобы загрузить репозиторий "llm.c", вам не нужно напрямую загружать официальный репозиторий. Используйте проект "https://github.com/anthonix/llm.c", поддерживающий устройства AMD. Если у вас возникли проблемы с обучением, вы можете переключиться на версию исходного кода, которую я использую. Текущая версия, которую я использую, — "37dfcf6":

cd llm.c
git checkout 37dfcf6

Если вам необходимо переключить версии, используйте следующую командную строку для переключения после клонирования проекта с помощью git:

1. Установить зависимостей проекта

Сначала установите зависимости проекта:  

pip install -r requirements.txt 

Обратите внимание, что перед установкой зависимостей из requirements.txt необходимо сначала установить Torch, чтобы избежать конфликтов версий.

Далее скомпилируйте проект  

make train_gpt2amd AMDGPU_TARGETS=gfx1100 

Чтобы определить конкретную архитектуру ISA (Instruction Set Architecture), используйте rocminfo и отфильтруйте результаты с помощью grep:  

rocminfo | grep Name:  

2. Подготовка к обучению

Этот шаг аналогичен обучению на CPU, поэтому я не буду здесь вдаваться в подробности. При необходимости обратитесь к предыдущей статье. Ниже приведена команда обучения.

Получите данные:

python data_enc

Подготовка к обучению:

python train_gpt2.py --input_bin data/val_data.bin

 Замените "data/val_data.bin" на путь, полученный при запуске data_enc.   

Для этого выполните: 

make train_gpt2amd AMDGPU_TARGETS=gfx1100  

Опять же, замените gfx1100 на вашу конкретную ISA, полученную от rocminfo.   

Примечание:  

Если вы столкнулись с сообщением "fatal error: ‘cmath’ file not found", это, скорее всего, связано с неправильной версией g++. Некоторые версии Ubuntu поставляются с g++11, а не с g++12. Установите g++12 и сделайте его версией по умолчанию: 

apt install g++-12  

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 60 --slave /usr/bin/g++ g++ /usr/bin/g++-12 
Проигнорируйте сообщение "4 warnings generated when compiling for host", выполните следующую команду:  
./train_gpt2amd  

При запуске последней команды я получил сбой программы с сообщением "[CUDA ERROR] at file build/hip/llmc/layernorm.cuh:400". Если вы сожалеете о выборе AMD, поверьте мне, это только начало — впереди вас ждет еще много испытаний. Путешествие с AMD только начинается!  

Если всё получилось, отлично! Если нет, не расстраивайтесь, мы все равно можем использовать скрипты Python для обучения модели.   

Используя скрипты Python для обучения модели, вы можете выполнить следующую команду:  

python train_gpt2.py \
    --input_bin "./data/train_data.bin" \
    --input_val_bin "./data/val_data.bin" \
    --val_loss_every 10 \
    --sample_every 0 \
    --output_dir pylog124M \
    --write_tensors 0 \
    --model d12 \
    --batch_size 16 \
    --sequence_length 128 \
    --total_batch_size 4096 \
    --dtype bfloat16 \
    --compile 1 \
    --tensorcores 1 \
    --flash 1 \
    --num_iterations 100 \
    --weight_decay 0.1 \
    --zero_stage 1 \
    --learning_rate 0.0006 \
    --warmup_iters 0 \
    --learning_rate_decay_frac 0.0 \
    --overfit_single_batch 0

Вот несколько параметров, которые необходимо упомянуть:  

  • –input_bin "./data/train_data.bin" - наш обучающий набор данных;
  • –input_val_bin "./data/val_data.bin" - наш набор данных для проверки;
  • –val_loss_every 10 - выводить значение потери через каждое определенное количество шагов;
  • –batch_size 16 - это значение должно быть степенью числа 2, в противном случае возникнет ошибка. Поскольку мы просто проводим тестирование и набор данных невелик, слишком большое значение не нужно;
  • –sequence_length 128 - это значение должно быть степенью числа 2, в противном случае возникнет ошибка, поскольку длина последовательности нашего набора данных составляет 64, поэтому я установил здесь значение 128; 
  • –total_batch_size 4096 - мы просто тестируем, поэтому это значение не должно быть слишком большим, аналогично, это значение должно быть степенью числа 2, иначе возникнет ошибка; 
  • –num_iterations 100 - количество шагов обучения. Поскольку это тест, я просто установил его равным 100;
  • –flash 1 - следует ли включить flash attention: 1 — включить, 0 — выключить. 

Результаты запуска:

re

Как вы видите, мы успешно обучили эксклюзивную для нас модель финансового языка с использованием GPU. Теперь давайте вычтем время, которое мы потратили на обучение с использованием CPU, и сравним:  

old  

Первоначально процесс обучения CPU занимал в среднем около 8000 мс на шаг, тогда как обучение GPU занимало менее 80 мс на шаг.

Хотя некоторые параметры могли немного измениться, нетрудно заметить по времени каждого шага обучения, что использование GPU значительно ускорит процесс обучения, почти в 100 раз!  

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

Но не волнуйтесь, в следующих статьях мы обсудим, как точно настроить большую языковую модель, используя наши собственные данные, а затем создать советник и протестировать ее.  

Примечание:  

Если в этом месте возникает ошибка RuntimeError: HIP error: the operation cannot be performed in the present state. Скомпилируйте с помощью TORCH_USE_HIP_DSA, чтобы включить утверждения на стороне устройства.  

Попробуйте добавить переменные среды:  

export HSA_OVERRIDE_GFX_VERSION=11.0.0

export HIP_VISIBLE_DEVICES=0

export ROCM_PATH=/opt/rocm

export AMDGPU_TARGETS=gfx1100

Или добавьте следующий код в начало train_gpt2.py:  

from os import putenv

putenv(“HSA_OVERRIDE_GFX_VERSION”, “11.0.0”)  

Если 11.0.0 — это HSA 7900xtx, вам необходимо проверить HSA в соответствии с вашим собственным устройством и изменить его на соответствующее значение. Gfx1100 — это ISA 7900xtx. Вам необходимо изменить соответствующее значение в соответствии с вашим оборудованием.  


Итог

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

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

Увидимся в следующей статье! 

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/13498

Прикрепленные файлы |
data_enc.py (2.87 KB)
llm_data.csv (1139.04 KB)
Советник на базе универсального аппроксиматора MLP Советник на базе универсального аппроксиматора MLP
В статье представлен простой и доступный способ использования нейронной сети в торговом советнике, который не требует глубоких знаний в машинном обучении. Метод исключает нормализацию целевой функции и устраняет проблемы "взрыва весов" и "ступора сети", предлагая интуитивное обучение и наглядный контроль результатов.
Построение модели для ограничения диапазона сигналов по тренду (Часть 5): Система уведомлений (Часть II) Построение модели для ограничения диапазона сигналов по тренду (Часть 5): Система уведомлений (Часть II)
В статье подробно рассматривается интеграция уведомлений индикаторов MetaTrader 5 в Telegram с использованием возможностей MQL5, Python и API Telegram Bot. Вы сможете применить полученную информацию в своих проектах.
Автоматическая оптимизация параметров для торговых стратегий с Python и MQL5 Автоматическая оптимизация параметров для торговых стратегий с Python и MQL5
Существует несколько типов алгоритмов самостоятельной оптимизации торговых стратегий и параметров. Эти алгоритмы используются для автоматического улучшения торговых стратегий на основе исторических и текущих рыночных данных. В этой статье мы рассмотрим один из них на примерах реализаций на Python и MQL5.
Нейросети в трейдинге: Ансамбль агентов с использованием механизмов внимания (Окончание) Нейросети в трейдинге: Ансамбль агентов с использованием механизмов внимания (Окончание)
В предыдущей статье мы познакомились с мультиагентным адаптивным фреймворком MASAAT, который использует ансамбль агентов для перекрестного анализа мультимодального временного ряда в разных масштабах представления данных. И сегодня мы доведем до логического завершения начатую ранее работу по реализации подходов данного фреймворка средствами MQL5.