HuggingFace Transformers 4.29 : Tutorials : 推論用パイプライン

HuggingFace Transformers 4.29 : Tutorials : 推論用パイプライン (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/23/2023 (v4.29.1)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace Transformers 4.29 : Tutorials : 推論用パイプライン

pipeline() は任意の言語、コンピュータビジョン、発話とマルチモーダル・タスク上、推論のために ハブ からの任意のモデルを使用することを単純にします。特定のモダリティでの経験がなくてもあるいはモデルの背後のコードを理解していなくても、依然として pipeline() でそれらを推論用に利用できます!このチュートリアルは以下を教えます :

  • 推論用に pipeline() を使用する。
  • 特定のトークナイザーやモデルを使用する。
  • 音声, ビジョン, マルチモーダル・タスクのために pipeline() を使用する。

サポートされるタスクと利用可能なパラメータの完全なリストについては pipeline() ドキュメントを見てください。

 

パイプラインの使用方法

各タスクが関連付けられた pipeline() を持つ一方で、一般的な pipeline() 抽象を使用するのがより簡単です、これはタスク固有のパイプライン総てを含みます。pipeline() は、タスクのために推論可能なデフォルトのモデルと前処理クラスを自動的にロードします。

  1. pipeline() を作成することから始めて推論タスクを指定します :
    from transformers import pipeline
    
    generator = pipeline(task="automatic-speech-recognition")
    

  2. 入力テキストを pipeline() に渡します :
    generator("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
    
    {'text': 'I HAVE A DREAM BUT ONE DAY THIS NATION WILL RISE UP LIVE UP THE TRUE MEANING OF ITS TREES'}
    

    思っていたのと違う結果でしたか?より良い文字起こしを得られるか、ハブの 最もダウンロードされた自動発話認識モデル の幾つかを確認してみましょう。openai/whisper-large を試してみましょう :

    generator = pipeline(model="openai/whisper-large")
    generator("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
    
    {'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}
    

    この結果はより正確になりました!様々な言語や貴方の領域に特化されたモデルでモデル用ハブを確認することを強く勧めます。モデルが適合して他のものよりも上手くレアケースを処理できるかを見るためにハブ上でブラウザからモデル結果を直接確認して比較することができます。そして貴方のユースケースのためのモデルが見つからない場合には、常に自身で 訓練 を始めることができます!

     
    幾つかの入力を持つ場合には、入力をリストとして渡すことができます :

    generator(
        [
            "https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac",
            "https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac",
        ]
    )
    

    データセット全体に対して反復したい場合や webserver の推論用にそれを使用したい場合は、専用のパートを確認してください。

     

    パラメータ

    パイプラインは多くのパラメータをサポートしています ; 幾つかはタスク固有で、幾つかはすべてのパイプラインに共通です。一般にパラメータは好きな位置で指定できます :

    generator = pipeline(model="openai/whisper-large", my_parameter=1)
    out = generator(...)  # This will use `my_parameter=1`.
    out = generator(..., my_parameter=2)  # This will override and use `my_parameter=2`.
    out = generator(...)  # This will go back to using `my_parameter=1`.
    

    3 つの重要なものを確認しましょう :

     

    デバイス

    device=n 使用すれば、パイプラインはモデルを指定されたデバイス上に自動的に配置します。これは貴方が PyTorch か Tensorflow のいずれを使用していても関係なく動作します。

    generator = pipeline(model="openai/whisper-large", device=0)
    

    モデルが単一の GPU に対して大きすぎる場合、🤗 Accelerate がモデル重みをロードしてストアする方法を自動的に決定することを可能にするために device_map=”auto” を設定することができます。

    #!pip install accelerate
    generator = pipeline(model="openai/whisper-large", device_map="auto")
    

    device_map=”auto” が渡される場合、パイプラインをインスタンスかするときに引数 device=device を追加する必要はないことに注意してください、幾つかの予期せぬ動作に遭遇するかもしれないからです!

     

    バッチサイズ

    デフォルトでは、パイプラインは ここ で詳細が說明されるような理由でバッチ推論を行ないません。理由はバッチ処理は必ずしも高速ではないことで、幾つかのケースでは実際にかなり遅い可能性があります。

    しかし貴方のユースケースで動作するならば、使用できます :

    generator = pipeline(model="openai/whisper-large", device=0, batch_size=2)
    audio_filenames = [f"audio_{i}.flac" for i in range(10)]
    texts = generator(audio_filenames)
    

    これは 10 の提供された音声ファイル上でパイプラインを実行しますが、それらは貴方の更なるコードを必要とすることなく 2 つのバッチをモデルに渡します (これは GPU 上にあり、そこではバッチ処理はより役立つ傾向にあります)。出力はバッチ処理なしに受け取ったであろうものと常に一致するはずです。それはパイプラインがより高速であることに役立つ方法としてのみ意図されています。

    パイプラインはまたバッチ処理の複雑さをある程度軽減します、何故ならば (長い音声ファイルのような) 単一のアイテムはモデルにより処理されるために複数のパートに分割される (chunk) 必要があるからです。パイプラインはこの チャンク・バッチ処理 を実行します。

     

    タスク固有のパラメータ

    すべてのタスクはタスク固有なパラメータを提供しています、これらは追加の柔軟性とジョブを遂行するのに役立つオプションを可能にします。例えば、transformers.AutomaticSpeechRecognitionPipeline.call() メソッドは return_timestamps パラメータを持ち、これは動画に字幕をつけるために有望であるように思われます。

    # Not using whisper, as it cannot provide timestamps.
    generator = pipeline(model="facebook/wav2vec2-large-960h-lv60-self", return_timestamps="word")
    generator("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
    
    {'text': 'I HAVE A DREAM BUT ONE DAY THIS NATION WILL RISE UP AND LIVE OUT THE TRUE MEANING OF ITS CREED', 'chunks': [{'text': 'I', 'timestamp': (1.22, 1.24)}, {'text': 'HAVE', 'timestamp': (1.42, 1.58)}, {'text': 'A', 'timestamp': (1.66, 1.68)}, {'text': 'DREAM', 'timestamp': (1.76, 2.14)}, {'text': 'BUT', 'timestamp': (3.68, 3.8)}, {'text': 'ONE', 'timestamp': (3.94, 4.06)}, {'text': 'DAY', 'timestamp': (4.16, 4.3)}, {'text': 'THIS', 'timestamp': (6.36, 6.54)}, {'text': 'NATION', 'timestamp': (6.68, 7.1)}, {'text': 'WILL', 'timestamp': (7.32, 7.56)}, {'text': 'RISE', 'timestamp': (7.8, 8.26)}, {'text': 'UP', 'timestamp': (8.38, 8.48)}, {'text': 'AND', 'timestamp': (10.08, 10.18)}, {'text': 'LIVE', 'timestamp': (10.26, 10.48)}, {'text': 'OUT', 'timestamp': (10.58, 10.7)}, {'text': 'THE', 'timestamp': (10.82, 10.9)}, {'text': 'TRUE', 'timestamp': (10.98, 11.18)}, {'text': 'MEANING', 'timestamp': (11.26, 11.58)}, {'text': 'OF', 'timestamp': (11.66, 11.7)}, {'text': 'ITS', 'timestamp': (11.76, 11.88)}, {'text': 'CREED', 'timestamp': (12.0, 12.38)}]}
    

    ご覧できるように、モデルはテキストを推論してまたセンテンス内で いつ 各種単語が発音されたかを出力しました。

    各タスクで利用可能な多くのパラメータがありますので、貴方が何を変更できるかを見るには各タスクの API リファレンスを確認してください!例えば、AutomaticSpeechRecognitionPipeline は chunk_length_s パラメータを持ち、これはモデルがそれ自体では従来は処理できない、本当に長い音声ファイル (例えば、映画全体や 1 時間の動画に字幕をつける) で動作するために有用です。

    If you can’t find a parameter that would really help you out, feel free to request it !

     

    データセット上でパイプラインを使用

    パイプラインはまた大規模なデータセット上でも推論を実行できます。これを行う最も簡単な推奨方法はイテレータを使用することです :

    def data():
        for i in range(1000):
            yield f"My example {i}"
    
    
    pipe = pipeline(model="gpt2", device=0)
    generated_characters = 0
    for out in pipe(data()):
        generated_characters += len(out[0]["generated_text"])
    

    イテレータ data() は各結果を yield し、パイプラインは入力が iterable であることを自動的に認識し、そして GPU 上でデータを処理し続けながらそれを取得し始めます (これは内部的には DataLoader を使用しています)。これは重要です、何故ならばデータセット全体にメモリを割り当てる必要はなく、できるだけ高速に GPU に供給できるからです。

    バッチ処理は高速化する可能性がありますので、ここで batch_size パラメータを調整してみることは有用であるかもしれません。

    データセットに対してイテレートする最も単純な方法は 🤗 Datasets から一つをロードすることです :

    # KeyDataset is a util that will just output the item we're interested in.
    from transformers.pipelines.pt_utils import KeyDataset
    from datasets import load_dataset
    
    pipe = pipeline(model="hf-internal-testing/tiny-random-wav2vec2", device=0)
    dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation[:10]")
    
    for out in pipe(KeyDataset(dataset, "audio")):
        print(out)
    

     

    webserver 用にパイプラインを使用

    推論エンジンの作成は複雑なトピックで独自のページがふさわしいです。

    リンク

     

    ビジョン・パイプライン

    ビジョンタスクのために pipeline() を使用することは事実上は同じことです。

    タスクを指定して画像を分類器に渡します。画像はリンクか画像へのローカルパスで良いです。例えば、猫の何の種が下で示されるでしょう?

    from transformers import pipeline
    
    vision_classifier = pipeline(model="google/vit-base-patch16-224")
    preds = vision_classifier(
        images="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
    )
    preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
    preds
    
    [
    {'score': 0.4335, 'label': 'lynx, catamount'},
    {'score': 0.0348, 'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor'}, {'score': 0.0324, 'label': 'snow leopard, ounce, Panthera uncia'},
    {'score': 0.0239, 'label': 'Egyptian cat'}, {'score': 0.0229, 'label': 'tiger cat'}]
    

     

    テキスト・パイプライン

    NLP タスクのために pipeline() を使用することは事実上は同じことです。

    from transformers import pipeline
    
    # This model is a `zero-shot-classification` model.
    # It will classify text, except you are free to choose any label you might imagine
    classifier = pipeline(model="facebook/bart-large-mnli")
    classifier(
        "I have a problem with my iphone that needs to be resolved asap!!",
        candidate_labels=["urgent", "not urgent", "phone", "tablet", "computer"],
    )
    
    {
    'sequence': 'I have a problem with my iphone that needs to be resolved asap!!',
    'labels': ['urgent', 'phone', 'computer', 'not urgent', 'tablet'],
    'scores': [0.504, 0.479, 0.013, 0.003, 0.002]}
    

     

    マルチモーダル・パイプライン

    pipeline() は一つ以上のもモダリティをサポートしています。例えば、視覚的質問応答 (VQA) タスクはテキストと画像を組み合わせています。好きな画像リンクと画像について尋ねたい質問を自由に使ってください。画像は URL でも画像へのローカルパスでも構いません。

    例えば、この インボイス画像 を使用する場合 :

    from transformers import pipeline
    
    vqa = pipeline(model="impira/layoutlm-document-qa")
    vqa(
        image="https://huggingface.co/spaces/impira/docquery/resolve/2359223c1837a7587402bda0f2643382a6eefeab/invoice.png",
        question="What is the invoice number?",
    )
    
    [{'score': 0.42515, 'answer': 'us-001', 'start': 16, 'end': 16}]
    

    To run the example above you need to have pytesseract installed in addition to 🤗 Transformers:

    sudo apt install -y tesseract-ocr
    pip install pytesseract
    

     

    🤗 accelerate により大規模モデル上でパイプラインを使用

    🤗 accelerate を使用して大規模モデル上でパイプラインを簡単に実行できます!最初に “pip install accelerate” で accelerate をインストールしたことを確認してください。

    そしてまず device_map=”auto” を使用してモデルをロードします!例として facebook/opt-1.3b を使用します。

    # 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)
    

    bitsandbytes をインストールして引数 load_in_8bit=True を追加すれば、8-bit loaded モデルを渡すこともできます。

    # 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)
    

    Note that you can replace the checkpoint with any of the Hugging Face model that supports large model loading such as BLOOM!

     

    以上