Python/transformers
表示
< Python
Transformersの概要
[編集]Transformersは、最新の事前学習済みモデルを簡単にダウンロードして学習するためのAPIとツールを提供します。事前学習済みモデルを使用することで、モデルをゼロから学習するために必要なコンピューティングコストと時間、リソースを削減できます。これらのモデルは、さまざまなモダリティで一般的なタスクをサポートしています:
- 📝 自然言語処理: テキスト分類、固有表現認識、質問応答、言語モデリング、要約、翻訳、多肢選択、テキスト生成など。
- 🖼️ コンピュータビジョン: 画像分類、物体検出、セグメンテーション。
- 🗣️ オーディオ: 自動音声認識、オーディオ分類。
- 🐙 マルチモーダル: テーブル質問応答、光学文字認識、スキャンされた文書からの情報抽出、動画分類、ビジュアル質問応答。
Transformersのコード例
[編集]翻訳
[編集]`!pip install transformers sentencepiece pysbd`
import pysbd seg_en = pysbd.Segmenter(language="en", clean=False) from transformers import pipeline fugu_translator = pipeline('translation', model='staka/fugumt-en-ja') txt = 'This is a cat. It is very cute.' print(fugu_translator(seg_en.segment(txt)))
from transformers import ( MBartForConditionalGeneration, MBartTokenizer ) tokenizer = MBartTokenizer.from_pretrained("ken11/mbart-ja-en") model = MBartForConditionalGeneration.from_pretrained("ken11/mbart-ja-en") inputs = tokenizer("こんにちは", return_tensors="pt") translated_tokens = model.generate(**inputs, decoder_start_token_id=tokenizer.lang_code_to_id["en_XX"], early_stopping=True, max_length=48) pred = tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0] print(pred)
会話
[編集]import torch from transformers import AutoTokenizer, AutoModelForCausalLM device = torch.device("cuda" if torch.cuda.is_available() else "cpu") tokenizer = AutoTokenizer.from_pretrained("inu-ai/dolly-japanese-gpt-1b", use_fast=False) model = AutoModelForCausalLM.from_pretrained("inu-ai/dolly-japanese-gpt-1b").to(device) MAX_ASSISTANT_LENGTH = 100 MAX_INPUT_LENGTH = 1024 INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n入力:\n{input}\n[SEP]\n応答:\n' NO_INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n応答:\n' USER_NAME = "User" ASSISTANT_NAME = "Assistant" def prepare_input(role_instruction, conversation_history, new_conversation): instruction = "".join([f"{text} " for text in role_instruction]) instruction += " ".join(conversation_history) input_text = f"{USER_NAME}:{new_conversation}" return INPUT_PROMPT.format(instruction=instruction, input=input_text) def format_output(output): output = output.lstrip("<s>").rstrip("</s>").replace("[SEP]", "").replace("\\n", "\n") return output def generate_response(role_instruction, conversation_history, new_conversation): # 入力トークン数1024におさまるようにする for _ in range(8): input_text = prepare_input(role_instruction, conversation_history, new_conversation) token_ids = tokenizer.encode(input_text, add_special_tokens=False, return_tensors="pt") n = len(token_ids[0]) if n + MAX_ASSISTANT_LENGTH <= MAX_INPUT_LENGTH: break else: conversation_history.pop(0) conversation_history.pop(0) with torch.no_grad(): output_ids = model.generate( token_ids.to(model.device), min_length=n, max_length=min(MAX_INPUT_LENGTH, n + MAX_ASSISTANT_LENGTH), temperature=0.7, repetition_penalty=1.0, # 数値を大きくすると、文字列の繰り返しが減る do_sample=True, pad_token_id=tokenizer.pad_token_id, bos_token_id=tokenizer.bos_token_id, eos_token_id=tokenizer.eos_token_id, bad_words_ids=[[tokenizer.unk_token_id]] ) output = tokenizer.decode(output_ids.tolist()[0]) formatted_output_all = format_output(output) response = f"{ASSISTANT_NAME}:{formatted_output_all.split('応答:')[-1].strip()}" conversation_history.append(f"{USER_NAME}:{new_conversation}".replace("\n", "\\n")) conversation_history.append(response.replace("\n", "\\n")) return formatted_output_all, response role_instruction = [ f"{USER_NAME}:きみは「ずんだもん」なのだ。東北ずん子の武器である「ずんだアロー」に変身する妖精またはマスコットなのだ。一人称は「ボク」で語尾に「なのだー」を付けてしゃべるのだ。", f"{ASSISTANT_NAME}:了解したのだ。", f"{USER_NAME}:きみは同じ言葉を繰り返さず、何でも正確に要約して答えられるのだ。", f"{ASSISTANT_NAME}:了解したのだ。", ] conversation_history = [ ] questions = [ "日本で一番高い山は?", "日本で一番広い湖は?", "冗談を言ってください。", "世界で一番高い山は?", "世界で一番広い湖は?", "最初の質問は何ですか?", "今何問目?", "自己紹介をしてください。", ] # 各質問に対して応答を生成して表示 for question in questions: formatted_output_all, response = generate_response(role_instruction, conversation_history, question) print(f"{USER_NAME}:{question}\n{response}\n---")
深度推定
[編集]from PIL import Image import numpy as np import requests import torch from transformers import DPTForDepthEstimation, DPTFeatureExtractor model = DPTForDepthEstimation.from_pretrained("Intel/dpt-hybrid-midas", low_cpu_mem_usage=True) feature_extractor = DPTFeatureExtractor.from_pretrained("Intel/dpt-hybrid-midas") url = "http://images.cocodataset.org/val2017/000000039769.jpg" image = Image.open(requests.get(url, stream=True).raw) # prepare image for the model inputs = feature_extractor(images=image, return_tensors="pt") with torch.no_grad(): outputs = model(**inputs) predicted_depth = outputs.predicted_depth # interpolate to original size prediction = torch.nn.functional.interpolate( predicted_depth.unsqueeze(1), size=image.size[::-1], mode="bicubic", align_corners=False, ) # visualize the prediction output = prediction.squeeze().cpu().numpy() formatted = (output * 255 / np.max(output)).astype("uint8") depth = Image.fromarray(formatted) depth.show()
音声認識
[編集]import torch from transformers import pipeline from datasets import load_dataset device = "cuda:0" if torch.cuda.is_available() else "cpu" pipe = pipeline( "automatic-speech-recognition", model="openai/whisper-small", chunk_length_s=30, device=device, ) ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation") sample = ds[0]["audio"] prediction = pipe(sample.copy(), batch_size=8)["text"] # we can also return timestamps for the predictions prediction = pipe(sample.copy(), batch_size=8, return_timestamps=True)["chunks"]
テキスト生成モデルの使用
[編集]# pip install accelerate bitsandbytes import torch from transformers import pipeline pipe = pipeline(model="facebook/opt-1.3b", device_map="auto", model_kwargs={"load_in_8bit": True}) output = pipe("This is a cool example!", do_sample=True, top_p=0.95)
# pip install accelerate import torch from transformers import pipeline pipe = pipeline(model="facebook/opt-1.3b", torch_dtype=torch.bfloat16, device_map="auto") output = pipe("This is a cool example!", do_sample=True, top_p=0.95)
from transformers import pipeline generator = pipeline('text-generation', model='EleutherAI/gpt-neo-1.3B') generator("EleutherAI has", do_sample=True, min_length=50)
import torch from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-large", device_map="auto", torch_dtype=torch.float16) tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-large") inputs = tokenizer("AIによって私達の暮らしは、", return_tensors="pt").to(model.device) with torch.no_grad(): tokens = model.generate( **inputs, max_new_tokens=64, do_sample=True, temperature=0.7, top_p=0.9, repetition_penalty=1.05, pad_token_id=tokenizer.pad_token_id, ) output = tokenizer.decode(tokens[0], skip_special_tokens=True) print(output)
import torch from transformers import AutoTokenizer, GPTNeoForCausalLM tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-neo-1.3B") model = GPTNeoForCausalLM.from_pretrained("EleutherAI/gpt-neo-1.3B") inputs = tokenizer("Hello, my dog is cute", return_tensors="pt") outputs = model(**inputs, labels=inputs["input_ids"]) loss = outputs.loss logits = outputs.logits
物体検出モデルの使用
[編集]from transformers import YolosImageProcessor, YolosForObjectDetection from PIL import Image import torch import requests url = "http://images.cocodataset.org/val2017/000000039769.jpg" image = Image.open(requests.get(url, stream=True).raw) model = YolosForObjectDetection.from_pretrained('hustvl/yolos-tiny') image_processor = YolosImageProcessor.from_pretrained("hustvl/yolos-tiny") inputs = image_processor(images=image, return_tensors="pt") outputs = model(**inputs) # model predicts bounding boxes and corresponding COCO classes logits = outputs.logits bboxes = outputs.pred_boxes # print results target_sizes = torch.tensor([image.size[::-1]]) results = image_processor.post_process_object_detection(outputs, threshold=0.9, target_sizes=target_sizes)[0] for score, label, box in zip(results["scores"], results["labels"], results["boxes"]): box = [round(i, 2) for i in box.tolist()] print( f"Detected {model.config.id2label[label.item()]} with confidence " f"{round(score.item(), 3)} at location {box}" )
テーブル質問応答モデルの使用
[編集]from transformers import Pix2StructProcessor, Pix2StructForConditionalGeneration import requests from PIL import Image # モデルとトークナイザの読み込み processor = Pix2StructProcessor.from_pretrained('google/deplot') model = Pix2StructForConditionalGeneration.from_pretrained('google/deplot') # 画像のURLを指定して画像を取得 url = "https://example.com/image.png" image = Image.open(requests.get(url, stream=True).raw) # テキストと画像を入力として質問応答を実行 inputs = processor(images=image, text="Generate underlying data table of the figure below:", return_tensors="pt") predictions = model.generate(**inputs, max_new_tokens=512) # 結果の表示 print(processor.decode(predictions[0], skip_special_tokens=True))
これらのコード例を使用することで、Transformersライブラリを利用してさまざまなタスクに対して高性能な事前学習済みモデルを簡単に使用できます。