LINUX.ORG.RU

Как без интернета использовать модели transformers?

 , ,


0

1

Как локально запустить например вот это?

Честно говоря, я так и не понял сам процесс запуска. В гайдах обычно пишут установите то-то и то-то (transformers и pytorch чаще всего), после чего надо куда писать код (КУДА? В гайдах это колабы и какие-то юпитер-ноутбуки), но на компе есть только терминал, питон, его виртуальное окружение, трансформеры с зависимостями и папка с файлами модели. Может надо создавать файлы .py и запускать их? (По крайней мере я пробовал размещать файлы модели и код-пример в файле .py в одной папке, оно запускается, но всё равно требует интернет, типа это не локальная папка, если вы используете локальный репозиторий и бла-бла-бла).

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

После махинаций c hugging face, koboldcpp выглядит крайне адекватно (шикарная wiki и подробное описание сути ошибок), в сравнении с пустой страницей, где есть только кусок питоновского кода, а иногда нет и его, просто валяются файлы модели и делай, что хочешь…

Для llm и stable diffusion есть отдельные консольные программы различной степени сложности, но для моделей по переводу языков и других мелких моделей такого не делают. Собственно, а как же их тогда запустить без колабов и интернета? Чисто в терминале (или, может быть, веб-интерфейсе)

Перемещено hobbit из general

Дайте названия. Я посмотрю, что там, вдруг найду документацию.

UPD: погуглил, походу интерфейс например к фейсбушной штуке придется писать самому. Вот пример такого интерфейса для обработки текста

https://github.com/huggingface/transformers/issues/24169

vbcnthfkmnth123 ★★★★★
()
Последнее исправление: vbcnthfkmnth123 (всего исправлений: 1)
Ответ на: комментарий от vbcnthfkmnth123

Спасибо, запустил таки. Оказывается там надо явно указывать переменную окружения перед командой: TRANSFORMERS_OFFLINE=1 python nllb.py. А я думал, что это куда-то в конфиги или в сам файл надо вписывать.

Переводит так себе. По крайней мере на 600M и 1.3B, на остальные версии не хватает памяти)

Первую модель (opus-mt-ru-en) пока так и не смог завести, хотя я использовал код из документации, буду копать, по возможности. Еще раз спасибо за помощь!

Reptile
() автор топика
Ответ на: комментарий от cobold

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

Reptile
() автор топика
Ответ на: комментарий от ei-grad

О, спасибо! Буду изучать. Все-таки очень интересно найти какую-нибудь альтернативу гуглу и яндексу.

В целом я знаю что есть deepl - пока у них лучшая модель ru-en \ en-ru, но он с интернетом, хотя я знаю консольную утилиту по переводу с японского и там вроде как используется offline версия jp-eng от deepl, интересно как умудрились так сделать, их моделей нет в открытом доступе. Может быть, просто натренировали новую модель с помощью их API?

Reptile
() автор топика
Ответ на: комментарий от ei-grad

Я пробовал запускать argos и его натренированную модель для en-ru, переводит сносно, но все равно слабо. Буду изучать разные модели тогда. А вообще принципиально через что запускать llm именно для перевода текстов? Там просто достаточно много консольных утилит, включая ollama. koboldai, koboldcpp, lollms-webui, text-generation webui и прочее. Наверно, можно взять модель, основанную на русских датасетах для более правильного перевода?

Reptile
() автор топика
Ответ на: комментарий от ei-grad

Кстати получилось запустить даже без докера, скачал скрипт, скачал папку с моделями, установил gradio (понял откуда у скрипта интерфейс) и все работает в локалке. Ещё раз спасибо за наводку! Почему-то я упустил из виду раздел spaces, наверно, потому что сначала думал, что нельзя скачать скрипты.

Reptile
() автор топика

Как локально запустить например вот это?

  1. скачиваете модель через git c lfs или мышкой тыкая на странице модели во вкладке «Files and versions»

  2. создаете новый файл test.py

#!/usr/bin/env python3

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline

tokenizer = AutoTokenizer.from_pretrained('/path/to/opus-mt-ru-en/vocab.txt', local_files_only=True)

model = BertForMaskedLM.from_pretrained('/path/to/opus-mt-ru-en/pytorch_model.bin', config='/path/to/opus-mt-ru-en/config.json', local_files_only=True)

nlp = pipeline("ner", model=model, tokenizer=tokenizer)

example = "Меня зовут Вольфганг и я живу в Берлине"

result = nlp(example)

print(result)

и работаете с загруженной локально моделью.

Obezyan
()
Ответ на: комментарий от Obezyan

О, спасибо за скрипт! Буду пробовать. А вообще интересно, можно ли где-то брать примеры подобных скриптов или их надо самому писать? Просто я пытался взять из документации вот этот скрипт:

from transformers import AutoTokenizer, MarianMTModel

src = "fr"  # source language
trg = "en"  # target language

model_name = f"Helsinki-NLP/opus-mt-{src}-{trg}"
model = MarianMTModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

sample_text = "où est l'arrêt de bus ?"
batch = tokenizer([sample_text], return_tensors="pt")

generated_ids = model.generate(**batch)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

Но он не запускался, хотя там вроде как сказано, что скрипт как раз для моделей marian. Опять же, я не специалист в этой области, так что мог что-то не так понять.

Reptile
() автор топика
Ответ на: комментарий от Reptile

можно ли где-то брать примеры подобных скриптов или их надо самому писать?

Так там кода на 5 строчек, можно сделать над собой усилие и самому написать :)

Вообще, если вы хотите использовать transformers то стоит уделить немного времени и прочитать какие инструменты для работы дают и как их использовать. Для ваших задач в первую очередь будет полезно освоить Pipeline

На python и так можно писать код не приходя в сознание, а зная piplinе и pandas можно крутить готовые сети как угодно.

По вашему коду видно что хотели использовать AutoTokenizer с MarianMTModel, хотя должен быть MarianTokenizer. Как это понять? Открыть документацию :)

from transformers import MarianTokenizer, MarianMTModel

from typing import List
src = 'fr'  # source language
trg = 'en'  # target language

sample_text = "où est l'arrêt de bus ?"
mname = f'Helsinki-NLP/opus-mt-{src}-{trg}'

model = MarianMTModel.from_pretrained(mname)
tok = MarianTokenizer.from_pretrained(mname)
batch = tok.prepare_seq2seq_batch(src_texts=[sample_text])  # don't need tgt_text for inference
gen = model.generate(**batch)  # for forward pass: model(**batch)
words: List[str] = tok.batch_decode(gen, skip_special_tokens=True)  # returns "Where is the bus stop ?"
Obezyan
()
Ответ на: комментарий от Obezyan

Спасибо за пример. Я не особо умею в код, ибо не программист, просто заинтересовался все этой темой на волне бесконечно появляющихся моделей под разные задачи)

На python и так можно писать код не приходя в сознание, а зная piplinе и pandas можно крутить готовые сети как угодно.

Всё, заинтриговали, теперь точно буду изучать python и piplinе) Может, когда-нибудь научусь тренировать свои модели.

А вообще интересно откуда у людей столько денег (модели для текста от 13B до 70B появляются практически каждый день, плюс стабильная диффузия… это ж сколько надо каких-нибудь a100, чтоб натренировать хотя бы deepl-эквивалент)

Вообще, непонятно конечно, куча денег и ресурсов у яндекса, а перевод даже русского языка хромает, но llm на 100B запилили.

Reptile
() автор топика
Ответ на: комментарий от Reptile

Я не особо умею в код, ибо не программист

Я это сразу понял, поэтому и пример кода написал и очевидную для большинства программистов вещь под названием RTFM. Там есть готовые примеры кода которые можно использовать.

Всё, заинтриговали, теперь точно буду изучать python

Я много грешил в ИТ. Одним грехом больше, одним меньше…

откуда у людей столько денег

Это делается не на деньги людей, а на деньги организаций.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от Obezyan

Это делается не на деньги людей, а на деньги организаций.

Это, наверно справедливо для совсем больших моделей от 100B и выше? (типа яндекс, гугл, фейсбук, сбербанк и т. п.) Просто если судить по тому как люди клепают свои вариант llm и diffusion (в большей степени для написания кода, чат ботов или nsfw), то резонно хочется задать им всем вопрос в духе: «Э… неужели вы арендуете gpu cloud с кучей a100 и тренируете свои модели неделями?» Тем временем слоган таких серверов, вероятно примерно следующий:

Вы ещё не продали свою почку? Тогда мы идем к вам!

Иначе как так быстро выходят nsfw модели? )) Возможно я ошибаюсь, но, мне кажется, что даже для 7B модели нужна куча ресурсов, не говоря уже о диффузии с миллионами картинок.

Reptile
() автор топика
Последнее исправление: Reptile (всего исправлений: 1)
Ответ на: комментарий от Reptile

Просто если судить по тому как люди клепают свои вариант llm и diffusion

Они доучивают уже обученные сети. Это называется finetuning, для него достаточно гораздо меньшей мощности. Например, одной RTX A6000 в большинстве случаев более чем достаточно для файнтюнинга во вменяемый срок. Вот для обучения с нуля таких сетей реально нужен DGX-кластер от Nvidia.

Obezyan
()
Ответ на: комментарий от Obezyan

Понятно. Спасибо за пояснение. На правах новичка ещё хотел спросить как отвязывать скрипты с gradio от интернета?) Создать локальный путь или что-то такое.

import torch
import gradio as gr
from transformers import pipeline
import ast

translation_task_names = {
    'English to Russian': 'translation_en_to_ru',
    'Russian to English': 'translation_ru_to_en',
}

model_names = {
    'Opus-En-Ru': 'Helsinki-NLP_opus-mt-en-ru',
    'Opus-Ru-En': 'Helsinki-NLP_opus-mt-ru-en',
}

# Create a dictionary to store loaded models ???
loaded_models = {}

# Simple translation function
def translate_text(model_choice, task_choice, text_input, load_in_8bit, device):
    model_key = (model_choice, task_choice, load_in_8bit)  # Create a tuple to represent the unique combination of task and 8bit loading

    # Check if the model is already loaded
    if model_key in loaded_models:
        translator = loaded_models[model_key]
    else:
        model_kwargs = {"load_in_8bit": load_in_8bit} if load_in_8bit else {}
        dtype = torch.float16 if load_in_8bit else torch.float32  # Set dtype based on the value of load_in_8bit
        translator = pipeline(task=translation_task_names[task_choice],
                            model=model_names[model_choice],  # Use selected model
                            device=device,  # Use selected device
                            model_kwargs=model_kwargs, 
                            torch_dtype=dtype,  # Set the floating point
                            use_fast=True
                            )
        # Store the loaded model
        loaded_models[model_key] = translator

    translation = translator(text_input)[0]['translation_text']
    return str(translation).strip()

def launch(model_choice, task_choice, text_input, load_in_8bit, device):
    return translate_text(model_choice, task_choice, text_input, load_in_8bit, device)

model_dropdown = gr.Dropdown(choices=list(model_names.keys()), label='Select Model')
task_dropdown = gr.Dropdown(choices=list(translation_task_names.keys()), label='Select Translation Task')
text_input = gr.Textbox(label="Input Text")  # Single line text input
load_in_8bit = gr.Checkbox(label="Load model in 8bit")
# https://www.gradio.app/docs/radio
device = gr.Radio(['cpu', 'cuda'], label='Select device', value='cpu')

iface = gr.Interface(launch, inputs=[model_dropdown, task_dropdown, text_input, load_in_8bit, device], 
                     outputs=gr.Textbox(type="text", label="Translation"))
iface.launch()

Мне сначала показалось, что он работает оффлайн, так как не увидел, что в консоли был процесс загрузки модели с hf, без интернета работать не хочет. Собственно, у меня в папке со скриптом две папки с моделями: Helsinki-NLP_opus-mt-en-ru и Helsinki-NLP_opus-mt-ru-en.

Reptile
() автор топика
Ответ на: комментарий от Reptile

Я не использую gradio т.к. мне не нужен человеческий интерфейс :)

Судя по коду дело не в gradio, похоже что вы не указываете что хотите использовать модель локально. У вас есть строка:

model=model_names[model_choice],  # Use selected model

Те вы назначаете выбранное имя модели, а не саму загруженную модель, в этом случае pipeline попытается стянуть ее из интернета. Посмотрите мой пример, там есть local_files_only=True и для модели и для токенизатора.

т.е. вам нужно что-то типа:

...
local_model_path  = "/path/to/" + model_names[model_choice] + "/pytorch_model.bin"
local_config_path = "/path/to/" + model_names[model_choice] + "/config.json"
local_vocab_path  = "/path/to/" + model_names[model_choice] + "/vocab.txt"

model = BertForMaskedLM.from_pretrained(local_model_path, config=local_config_path, local_files_only=True)

tokenizer = AutoTokenizer.from_pretrained(local_vocab_path, local_files_only=True)

translator = pipeline(task=translation_task_names[task_choice],
                            model=model,  # Use selected model
                            tokenizer=tokenizer, 
                            device=device,  # Use selected device
                            model_kwargs=model_kwargs, 
                            torch_dtype=dtype,  # Set the floating point
                            use_fast=True
                            )
...
Obezyan
()