#
Обращение за помощью на форумах

Форумы Hugging Face - это отличное место, где можно получить помощь от команды разработчиков библиотек и более широкого сообщества Hugging Face. Вот как выглядит главная страница в любой день:

С левой стороны вы можете увидеть все категории, по которым сгруппированы различные темы, а с правой - самые последние темы. Тема - это сообщение, содержащее заголовок, категорию и описание; это очень похоже на формат вопросов GitHub, который мы видели при создании нашего собственного набора данных в Главе 5. Как следует из названия, категория Beginners предназначена в первую очередь для тех, кто только начинает знакомиться с библиотеками и экосистемой Hugging Face. Здесь можно задать любой вопрос по любой из библиотек, будь то отладка кода или просьба о помощи, как что-то сделать. (При этом, если ваш вопрос касается какой-то конкретной библиотеки, вам, вероятно, следует обратиться в соответствующую категорию библиотек на форуме).

Аналогично, категории Intermediate и Research предназначены для более сложных вопросов, например, о библиотеках или новых крутых исследованиях в области НЛП, которые вы хотели бы обсудить.

И, конечно же, нельзя не упомянуть категорию Course, где вы можете задавать любые вопросы, связанные с курсом “Hugging Face”!

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

##
Написание хорошего поста на форуме

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

    from transformers import AutoTokenizer, AutoModel

    model_checkpoint = "distilbert-base-uncased"
    tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
    model = AutoModel.from_pretrained(model_checkpoint)

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

    text = """
    Generation One is a retroactive term for the Transformers characters that
    appeared between 1984 and 1993. The Transformers began with the 1980s Japanese
    toy lines Micro Change and Diaclone. They presented robots able to transform
    into everyday vehicles, electronic items or weapons. Hasbro bought the Micro
    Change and Diaclone toys, and partnered with Takara. Marvel Comics was hired by
    Hasbro to create the backstory; editor-in-chief Jim Shooter wrote an overall
    story, and gave the task of creating the characthers to writer Dennis O'Neil.
    Unhappy with O'Neil's work (although O'Neil created the name "Optimus Prime"),
    Shooter chose Bob Budiansky to create the characters.

    The Transformers mecha were largely designed by Shōji Kawamori, the creator of
    the Japanese mecha anime franchise Macross (which was adapted into the Robotech
    franchise in North America). Kawamori came up with the idea of transforming
    mechs while working on the Diaclone and Macross franchises in the early 1980s
    (such as the VF-1 Valkyrie in Macross and Robotech), with his Diaclone mechs
    later providing the basis for Transformers.

    The primary concept of Generation One is that the heroic Optimus Prime, the
    villainous Megatron, and their finest soldiers crash land on pre-historic Earth
    in the Ark and the Nemesis before awakening in 1985, Cybertron hurtling through
    the Neutral zone as an effect of the war. The Marvel comic was originally part
    of the main Marvel Universe, with appearances from Spider-Man and Nick Fury,
    plus some cameos, as well as a visit to the Savage Land.

    The Transformers TV series began around the same time. Produced by Sunbow
    Productions and Marvel Productions, later Hasbro Productions, from the start it
    contradicted Budiansky's backstories. The TV series shows the Autobots looking
    for new energy sources, and crash landing as the Decepticons attack. Marvel
    interpreted the Autobots as destroying a rogue asteroid approaching Cybertron.
    Shockwave is loyal to Megatron in the TV series, keeping Cybertron in a
    stalemate during his absence, but in the comic book he attempts to take command
    of the Decepticons. The TV series would also differ wildly from the origins
    Budiansky had created for the Dinobots, the Decepticon turned Autobot Jetfire
    (known as Skyfire on TV), the Constructicons (who combine to form
    Devastator),[19][20] and Omega Supreme. The Marvel comic establishes early on
    that Prime wields the Creation Matrix, which gives life to machines. In the
    second season, the two-part episode The Key to Vector Sigma introduced the
    ancient Vector Sigma computer, which served the same original purpose as the
    Creation Matrix (giving life to Transformers), and its guardian Alpha Trion.
    """

    inputs = tokenizer(text, return_tensors="pt")
    logits = model(**inputs).logits

    IndexError: index out of range in self

О-о, мы столкнулись с проблемой - и сообщение об ошибке гораздо более загадочно, чем те, что мы видели в разделе 2! Мы не можем разобраться в полном её описании, поэтому решили обратиться за помощью на форум Hugging Face. Как мы можем создать тему?

Чтобы начать, нам нужно нажать кнопку “Новая тема” в правом верхнем углу (обратите внимание, что для создания темы нам нужно войти в систему):

Откроется интерфейс для написания текста, где мы можем ввести название темы, выбрать категорию и составить сообщение:

Поскольку ошибка, похоже, связана исключительно с 🤗 Transformers, мы выберем эту категорию. Наша первая попытка объяснить проблему может выглядеть примерно так:

Хотя эта тема содержит сообщение об ошибке, с которой нам нужна помощь, есть несколько проблем с тем, как оно написано:

1. Заголовок не очень содержателен, поэтому любой, кто просматривает форум, не сможет понять, о чем идет речь, не прочитав и основной текст.
2. В тексте недостаточно информации о том, откуда берется ошибка и как ее воспроизвести.
3. В теме прямо указывается несколько человек, причем в несколько требовательном тоне.

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

###
Выберите содержательное название

Если вы пытаетесь получить помощь по поводу ошибки в вашем коде, хорошим правилом является включение достаточного количества информации в заголовок, чтобы другие могли быстро определить, смогут ли они ответить на ваш вопрос или нет. В нашем примере мы знаем имя возникающего исключения и имеем некоторые намеки на то, что оно срабатывает в прямом проходе модели, где мы вызываем `model(**inputs)`. Чтобы сообщить об этом, один из возможных вариантов заголовка может быть таким:

> Source of IndexError in the AutoModel forward pass?

Этот заголовок сообщает читателю, откуда, по вашему мнению, исходит ошибка, и если он уже сталкивался с `IndexError`, велика вероятность, что он поймет, как ее отладить. Конечно, заголовок может быть любым, какой вы захотите, и возможны другие варианты, например:

> Why does my model produce an IndexError?

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

###
Отформатируйте код

Читать исходный код в IDE достаточно сложно, но еще сложнее, когда код скопирован и вставлен в виде обычного текста! К счастью, форумы Hugging Face поддерживают использование Markdown, поэтому вы всегда должны заключать свои блоки кода в три обратных знака (```), чтобы их было легче читать. Давайте сделаем это, чтобы отформатировать сообщение об ошибке - и пока мы это делаем, давайте сделаем текст немного более вежливым, чем наша первоначальная версия:

Как видно на скриншоте, заключение блоков кода в обратные кавычки превращает исходный текст в отформатированный код, дополненный цветовой стилизацией! Также обратите внимание, что одиночные обратные кавычки могут быть использованы для форматирования встроенных переменных, как мы это сделали для `distilbert-base-uncased`. В таком оформлении сообщение выглядит гораздо лучше, и, если повезет, мы сможем найти кого-то из сообщества, кто догадается, в чем ошибка. Но вместо того, чтобы полагаться на удачу, давайте облегчим себе жизнь, включив трассировку во всех подробностях!

###
Добавьте текст полной трассировки

Как видно на скриншоте, заключение блоков кода в обратные знаки превращает исходный текст в отформатированный код, дополненный цветовой стилизацией! Также обратите внимание, что одиночные обратные знаки могут быть использованы для форматирования встроенных переменных, как мы это сделали для `distilbert-base-uncased`. Эта тема выглядит гораздо лучше, и, если повезет, мы сможем найти кого-то из сообщества, кто догадается, в чем ошибка. Однако вместо того, чтобы полагаться на удачу, давайте облегчим себе жизнь, включив в трассировку все подробности!

Это гораздо более информативно, и внимательный читатель сможет указать на то, что проблема, похоже, связана с передачей длинного входного сигнала из-за этой строки в трассировке:

> Token indices sequence length is longer than the specified maximum sequence length for this model (583 > 512).

Однако мы можем еще больше облегчить им задачу, предоставив фактический код, вызвавший ошибку. Давайте сделаем это прямо сейчас.

###
Предоставьте воспроизводимый пример

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

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