Этот блокнот познакомит вас с основами Petals — системы логического вывода и точной настройки языковых моделей с сотнями миллиардов параметров без необходимости использования высокопроизводительных GPU. С помощью Petals вы можете объединять вычислительные ресурсы с другими людьми и запускать большие языковые модели с миллиардами параметров, например BLOOM-196B или BLOOMZ того же размера, что и GPT-3. Если при запуске этого блокнота возникнут проблемы, сообщите нам об этом на канале #running-a-client нашего Discord! Установим Petals: Начнем с модели __DistributedBloom__ и ее применения для генерации текста. Эта машина загрузит небольшую часть веса модели (~ 8 ГБ из 352 ГБ) и будет полагаться на другие компьютеры в сети для запуска всей модели. Загрузка локальной части весов обычно занимает ~3 минуты. Теперь попробуем сгенерировать что-нибудь методом model.generate(). Первый вызов занимает около 5 секунд для подключения к рою petals. После подключения можно ожидать скорость генерации 1–1,5 секунды на токен. Если у вас недостаточно графических процессоров для размещения всей модели, это намного быстрее, чем то, что получится с помощью других методов, таких как разгрузка, которая занимает не менее 10–20 секунд на токен. Метод model.generate() по умолчанию запускает жадную генерацию. Можно выбрать и другие методы, такие как выборку top-p/top-k или лучевой поиск, передав соответствующие параметры. Можно даже написать пользовательские методы генерации, об этом подробнее ниже. Если хотите общаться с моделью в интерактивном режиме, можно воспользоваться интерфейсом сеанса логического вывода, который предоставляет простой способ вывести сгенерированные токены на лету или создать чат-бота, реагирующего на фразы человека. Сеанс логического вывода ищет цепочку серверов, которые будут выполнять последовательные шаги логического вывода и сохранять прошлые кэши внимания. Так для генерации фразы не нужно повторно запускать предыдущие токены через преобразователь. Если один из удаленных серверов выйдет из строя, Petals самостоятельно найдет замену и восстановит небольшую часть кэшей. Давайте посмотрим, как использовать Petals для написания простого чат-бота, который показывает токены сразу после их создания: Если вы разрабатываете инструмент для других людей, то с помощью Petals можете превратить код в удобное веб-приложение, такое как chat.petals.ml. Под капотом это приложение может подключаться к облегченной конечной точке HTTP для вывода, перенаправляющего все запросы в рой Petals.   Ваша модель — настоящий BLOOM-176B, но в GPU компьютера загружена только ее часть. Заглянем под капот: Векторное представление слов и некоторые другие слои — обычные модулями PyTorch, размещенными на вашем компьютере, но остальная часть модели (например, блоки трансформаторов) заключена в класс RemoteSequential. Это расширенный модуль PyTorch, который работает на распределенном множестве других машин. Тем не менее, вы можете получить доступ к отдельным слоям и их выводам, а еще пробежаться по ним вперед и назад:  В целом вы можете смешивать и сопоставлять распределенные слои, как в обычном PyTorch, и даже вставлять и обучать собственные слои (например, адаптеры) между предварительно обученными слоями. Читайте подробности в нашей статье Хотя удаленно размещенные блоки трансформаторов заморожены, для сохранения предварительно обученной модели одинаковой для всех пользователей, чтобы BLOOM решал разнообразные последующие задачи, обычно достаточно параметрически эффективных адаптеров (малых обучаемых слоев между предварительно обученными блоками модели, например, LoRA) или обучаемых входов, добавляемых перед входами модели, например, в P-Tuning v2. Ниже пример добавления простого обучаемого линейного слоя между 5-м и 6-м трансформаторными блоками предварительно обученной модели. Веса слоя и соответствующая статистика оптимизатора будут храниться локально: Интерфейс __model.inference_session()__ в Petals позволяет писать пользовательский код выводов. Вы можете использовать это для реализации любых необходимых алгоритмов выборки, или написать алгоритм лучевого поиска, запрещающий ругательства. Ниже рассмотрим, как можно повторно реализовать стандартный интерфейс model.generate() с прямыми проходами по всем слоям вручную: Мы разработали Petals как систему, управляемую сообществом, поэтому полагаемся на то, что люди будут предоставлять свои графические процессоры для увеличения мощности роя. Если у вас есть GPU, которые не всегда заняты, пожалуйста, подумайте о запуске сервера Petals. Остановите его в любое время, если хотите использовать GPU для чего-то другого. Те, кто работает на сервере, бонусом получают определенное ускорение при использовании Petals, ведь локально размещается часть модели больше. А если у вас GPU-машина со статическим публичным IP, запустить сервер можно в среде Anaconda: Или через наш образ Docker с поддержкой GPU: Это не позволит другим людям запускать пользовательский код на вашем компьютере. Больше о безопасности — здесь. Если ваш компьютер находится за NAT или брандмауэром, установка общедоступного сервера может оказаться сложнее, но она возможна. Пожалуйста, опишите ваши настройки в канале #running-a-server нашего Discord, мы вам поможем. Хотя вы можете написать адаптеры, Petals реализует несколько стандартных методов эффективной тонкой настройки параметров. В нашем репозитории на GitHub мы приводим примеры посложнее: Теперь вы знакомы с тем, как использовать Petals для разных задач, как он работает внутри и как увеличить его мощность. Вот несколько полезных ресурсов: А еще больше практики и полезная теория — на наших курсах:   Data Science и Machine Learning Python, веб-разработка Мобильная разработка Java и C# От основ — в глубину А также Школа Computer Science