DrDavis's picture
Upload folder using huggingface_hub
17c6d62 verified

Pipelines

ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฏใ€ๆŽจ่ซ–ใซใƒขใƒ‡ใƒซใ‚’ไฝฟใ†ใŸใ‚ใฎ็ฐกๅ˜ใงๅ„ชใ‚ŒใŸๆ–นๆณ•ใงใ‚ใ‚‹ใ€‚ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฏใ€่ค‡้›‘ใชใ‚ณใƒผใƒ‰ใฎใปใจใ‚“ใฉใ‚’ๆŠฝ่ฑกๅŒ–ใ—ใŸใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงใ™ใ€‚ ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฏใ€ใƒฉใ‚คใƒ–ใƒฉใƒชใ‹ใ‚‰่ค‡้›‘ใชใ‚ณใƒผใƒ‰ใฎใปใจใ‚“ใฉใ‚’ๆŠฝ่ฑกๅŒ–ใ—ใŸใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงใ€ๅๅ‰ไป˜ใๅ›บๆœ‰่กจ็พ่ช่ญ˜ใ€ใƒžใ‚นใ‚ฏ่จ€่ชžใƒขใƒ‡ใƒชใƒณใ‚ฐใ€ๆ„Ÿๆƒ…ๅˆ†ๆžใ€็‰นๅพดๆŠฝๅ‡บใ€่ณชๅ•ๅฟœ็ญ”ใชใฉใฎใ‚ฟใ‚นใ‚ฏใซ็‰นๅŒ–ใ—ใŸใ‚ทใƒณใƒ—ใƒซใชAPIใ‚’ๆไพ›ใ—ใพใ™ใ€‚ Recognitionใ€Masked Language Modelingใ€Sentiment Analysisใ€Feature Extractionใ€Question Answeringใชใฉใฎใ‚ฟใ‚นใ‚ฏใซ็‰นๅŒ–ใ—ใŸใ‚ทใƒณใƒ—ใƒซใชAPIใ‚’ๆไพ›ใ—ใพใ™ใ€‚ไปฅไธ‹ใ‚’ๅ‚็…งใฎใ“ใจใ€‚ ใ‚ฟใ‚นใ‚ฏๆฆ‚่ฆใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚

ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฎๆŠฝ่ฑกๅŒ–ใซใฏ2ใคใฎใ‚ซใƒ†ใ‚ดใƒชใƒผใŒใ‚ใ‚‹๏ผš

The pipeline abstraction

ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณ ๆŠฝ่ฑกๅŒ–ใฏใ€ไป–ใฎใ™ในใฆใฎๅˆฉ็”จๅฏ่ƒฝใชใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฎใƒฉใƒƒใƒ‘ใƒผใงใ™ใ€‚ไป–ใฎใ‚‚ใฎใจๅŒๆง˜ใซใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นๅŒ–ใ•ใ‚Œใพใ™ ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใงใ™ใŒใ€ใ•ใ‚‰ใชใ‚‹็”Ÿๆดปใฎ่ณชใ‚’ๆไพ›ใงใใพใ™ใ€‚

1 ใคใฎ้ …็›ฎใซๅฏพใ™ใ‚‹ๅ˜็ด”ใชๅ‘ผใณๅ‡บใ—:

>>> pipe = pipeline("text-classification")
>>> pipe("This restaurant is awesome")
[{'label': 'POSITIVE', 'score': 0.9998743534088135}]

ใƒใƒ– ใฎ็‰นๅฎšใฎใƒขใƒ‡ใƒซใ‚’ไฝฟ็”จใ—ใŸใ„ๅ ดๅˆใฏใ€ใƒขใƒ‡ใƒซใŒใ‚ชใƒณใซใชใฃใฆใ„ใ‚‹ๅ ดๅˆใฏใ‚ฟใ‚นใ‚ฏใ‚’็„ก่ฆ–ใงใใพใ™ใ€‚ ใƒใƒ–ใฏใ™ใงใซใใ‚Œใ‚’ๅฎš็พฉใ—ใฆใ„ใพใ™ใ€‚

>>> pipe = pipeline(model="FacebookAI/roberta-large-mnli")
>>> pipe("This restaurant is awesome")
[{'label': 'NEUTRAL', 'score': 0.7313136458396912}]

ๅคšใใฎ้ …็›ฎใซๅฏพใ—ใฆใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใ‚’ๅ‘ผใณๅ‡บใ™ใซใฏใ€list ใ‚’ไฝฟ็”จใ—ใฆใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใŒใงใใพใ™ใ€‚

>>> pipe = pipeline("text-classification")
>>> pipe(["This restaurant is awesome", "This restaurant is awful"])
[{'label': 'POSITIVE', 'score': 0.9998743534088135},
 {'label': 'NEGATIVE', 'score': 0.9996669292449951}]

ๅฎŒๅ…จใชใƒ‡ใƒผใ‚ฟใ‚ปใƒƒใƒˆใ‚’ๅๅพฉใ™ใ‚‹ใซใฏใ€Datasetใ‚’็›ดๆŽฅไฝฟ็”จใ™ใ‚‹ใ“ใจใ‚’ใŠๅ‹งใ‚ใ—ใพใ™ใ€‚ใ“ใ‚Œใฏใ€ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‹ๅฟ…่ฆใŒใชใ„ใ“ใจใ‚’ๆ„ๅ‘ณใ—ใพใ™ ใƒ‡ใƒผใ‚ฟใ‚ปใƒƒใƒˆๅ…จไฝ“ใ‚’ไธ€ๅบฆใซๅ‡ฆ็†ใ™ใ‚‹ใ“ใจใ‚‚ใ€่‡ชๅˆ†ใงใƒใƒƒใƒๅ‡ฆ็†ใ‚’่กŒใ†ๅฟ…่ฆใ‚‚ใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ“ใ‚Œใฏใ‚ซใ‚นใ‚ฟใƒ ใƒซใƒผใƒ—ใจๅŒใ˜ใใ‚‰ใ„้€Ÿใๅ‹•ไฝœใ™ใ‚‹ใฏใšใงใ™ใ€‚ GPUใ€‚ใใ‚ŒใŒๅ•้กŒใงใชใ„ๅ ดๅˆใฏใ€ใŸใ‚ใ‚‰ใ‚ใšใซๅ•้กŒใ‚’ไฝœๆˆใ—ใฆใใ ใ•ใ„ใ€‚

import datasets
from transformers import pipeline
from transformers.pipelines.pt_utils import KeyDataset
from tqdm.auto import tqdm

pipe = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h", device=0)
dataset = datasets.load_dataset("superb", name="asr", split="test")

# KeyDataset (only *pt*) will simply return the item in the dict returned by the dataset item
# as we're not interested in the *target* part of the dataset. For sentence pair use KeyPairDataset
for out in tqdm(pipe(KeyDataset(dataset, "file"))):
    print(out)
    # {"text": "NUMBER TEN FRESH NELLY IS WAITING ON YOU GOOD NIGHT HUSBAND"}
    # {"text": ....}
    # ....

ไฝฟใ„ใ‚„ใ™ใใ™ใ‚‹ใŸใ‚ใซใ€ใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใƒผใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใ‚‚ใงใใพใ™ใ€‚

from transformers import pipeline

pipe = pipeline("text-classification")


def data():
    while True:
        # This could come from a dataset, a database, a queue or HTTP request
        # in a server
        # Caveat: because this is iterative, you cannot use `num_workers > 1` variable
        # to use multiple threads to preprocess data. You can still have 1 thread that
        # does the preprocessing while the main runs the big inference
        yield "This is a test"


for out in pipe(data()):
    print(out)
    # {"text": "NUMBER TEN FRESH NELLY IS WAITING ON YOU GOOD NIGHT HUSBAND"}
    # {"text": ....}
    # ....

[[autodoc]] pipeline

Pipeline batching

ใ™ในใฆใฎใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใงใƒใƒƒใƒๅ‡ฆ็†ใ‚’ไฝฟ็”จใงใใพใ™ใ€‚ใ“ใ‚Œใฏใ†ใพใใ„ใใพใ™ ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใŒใ‚นใƒˆใƒชใƒผใƒŸใƒณใ‚ฐๆฉŸ่ƒฝใ‚’ไฝฟ็”จใ™ใ‚‹ใจใใฏๅธธใซ (ใคใพใ‚Šใ€ใƒชใ‚นใƒˆใ€datasetใ€ใพใŸใฏ generatorใ‚’ๆธกใ™ใจใ)ใ€‚

from transformers import pipeline
from transformers.pipelines.pt_utils import KeyDataset
import datasets

dataset = datasets.load_dataset("imdb", name="plain_text", split="unsupervised")
pipe = pipeline("text-classification", device=0)
for out in pipe(KeyDataset(dataset, "text"), batch_size=8, truncation="only_first"):
    print(out)
    # [{'label': 'POSITIVE', 'score': 0.9998743534088135}]
    # Exactly the same output as before, but the content are passed
    # as batches to the model

ใŸใ ใ—ใ€ใ“ใ‚Œใซใ‚ˆใฃใฆใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใŒ่‡ชๅ‹•็š„ใซๅ‘ไธŠใ™ใ‚‹ใ‚ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚็Šถๆณใซๅฟœใ˜ใฆใ€10 ๅ€ใฎ้ซ˜้€ŸๅŒ–ใพใŸใฏ 5 ๅ€ใฎไฝŽ้€ŸๅŒ–ใฎใ„ใšใ‚Œใ‹ใซใชใ‚Šใพใ™ใ€‚ ใƒใƒผใƒ‰ใ‚ฆใ‚งใ‚ขใ€ใƒ‡ใƒผใ‚ฟใ€ไฝฟ็”จใ•ใ‚Œใฆใ„ใ‚‹ๅฎŸ้š›ใฎใƒขใƒ‡ใƒซใซใคใ„ใฆใ€‚

ไธปใซ้ซ˜้€ŸๅŒ–ใงใ‚ใ‚‹ไพ‹:

from transformers import pipeline
from torch.utils.data import Dataset
from tqdm.auto import tqdm

pipe = pipeline("text-classification", device=0)


class MyDataset(Dataset):
    def __len__(self):
        return 5000

    def __getitem__(self, i):
        return "This is a test"


dataset = MyDataset()

for batch_size in [1, 8, 64, 256]:
    print("-" * 30)
    print(f"Streaming batch_size={batch_size}")
    for out in tqdm(pipe(dataset, batch_size=batch_size), total=len(dataset)):
        pass
# On GTX 970
------------------------------
Streaming no batching
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 5000/5000 [00:26<00:00, 187.52it/s]
------------------------------
Streaming batch_size=8
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 5000/5000 [00:04<00:00, 1205.95it/s]
------------------------------
Streaming batch_size=64
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 5000/5000 [00:02<00:00, 2478.24it/s]
------------------------------
Streaming batch_size=256
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 5000/5000 [00:01<00:00, 2554.43it/s]
(diminishing returns, saturated the GPU)

ๆœ€ใ‚‚้€ŸๅบฆใŒไฝŽไธ‹ใ™ใ‚‹ไพ‹:

class MyDataset(Dataset):
    def __len__(self):
        return 5000

    def __getitem__(self, i):
        if i % 64 == 0:
            n = 100
        else:
            n = 1
        return "This is a test" * n

ใ“ใ‚Œใฏใ€ไป–ใฎๆ–‡ใซๆฏ”ในใฆ้žๅธธใซ้•ทใ„ๆ–‡ใŒๆ™‚ๆŠ˜ใ‚ใ‚Šใพใ™ใ€‚ใใฎๅ ดๅˆใ€ๅ…จไฝ“ใฎใƒใƒƒใƒใฏ 400 ใงใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ ใƒˆใƒผใ‚ฏใƒณใŒ้•ทใ„ใŸใ‚ใ€ใƒใƒƒใƒๅ…จไฝ“ใŒ [64, 4] ใงใฏใชใ [64, 400] ใซใชใ‚Šใ€้€ŸๅบฆใŒๅคงๅน…ใซไฝŽไธ‹ใ—ใพใ™ใ€‚ใ•ใ‚‰ใซๆ‚ชใ„ใ“ใจใซใ€ ใƒใƒƒใƒใŒๅคงใใใชใ‚‹ใจใ€ใƒ—ใƒญใ‚ฐใƒฉใƒ ใฏๅ˜็ด”ใซใ‚ฏใƒฉใƒƒใ‚ทใƒฅใ—ใพใ™ใ€‚

------------------------------
Streaming no batching
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 1000/1000 [00:05<00:00, 183.69it/s]
------------------------------
Streaming batch_size=8
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 1000/1000 [00:03<00:00, 265.74it/s]
------------------------------
Streaming batch_size=64
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 1000/1000 [00:26<00:00, 37.80it/s]
------------------------------
Streaming batch_size=256
  0%|                                                                                 | 0/1000 [00:00<?, ?it/s]
Traceback (most recent call last):
  File "/home/nicolas/src/transformers/test.py", line 42, in <module>
    for out in tqdm(pipe(dataset, batch_size=256), total=len(dataset)):
....
    q = q / math.sqrt(dim_per_head)  # (bs, n_heads, q_length, dim_per_head)
RuntimeError: CUDA out of memory. Tried to allocate 376.00 MiB (GPU 0; 3.95 GiB total capacity; 1.72 GiB already allocated; 354.88 MiB free; 2.46 GiB reserved in total by PyTorch)

ใ“ใฎๅ•้กŒใซๅฏพใ™ใ‚‹้ฉๅˆ‡ใช (ไธ€่ˆฌ็š„ใช) ่งฃๆฑบ็ญ–ใฏใชใใ€ไฝฟ็”จใงใใ‚‹่ท้›ขใฏใƒฆใƒผใ‚นใ‚ฑใƒผใ‚นใซใ‚ˆใฃใฆ็•ฐใชใ‚‹ๅ ดๅˆใŒใ‚ใ‚Šใพใ™ใ€‚ใฎใƒซใƒผใƒซ ่ฆชๆŒ‡๏ผš

ใƒฆใƒผใ‚ถใƒผใซใจใฃใฆใฎ็ตŒ้จ“ๅ‰‡ใฏๆฌกใฎใจใŠใ‚Šใงใ™ใ€‚

  • ใƒใƒผใƒ‰ใ‚ฆใ‚งใ‚ขใ‚’ไฝฟ็”จใ—ใฆใ€่ฒ ่ทใซๅฏพใ™ใ‚‹ใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚’ๆธฌๅฎšใ—ใพใ™ใ€‚ๆธฌใฃใฆใ€ๆธฌใฃใฆใ€ๆธฌใ‚Š็ถšใ‘ใ‚‹ใ€‚ๅฎŸๆ•ฐใจใ„ใ†ใฎใฏใ€ ้€ฒใ‚€ในใๅ”ฏไธ€ใฎๆ–นๆณ•ใ€‚

  • ใƒฌใ‚คใƒ†ใƒณใ‚ทใซๅˆถ็ด„ใŒใ‚ใ‚‹ๅ ดๅˆ (ๅฎŸ้š›ใฎ่ฃฝๅ“ใŒๆŽจ่ซ–ใ‚’ๅฎŸ่กŒใ—ใฆใ„ใ‚‹ๅ ดๅˆ)ใ€ใƒใƒƒใƒๅ‡ฆ็†ใ‚’่กŒใ‚ใชใ„ใงใใ ใ•ใ„ใ€‚

  • CPU ใ‚’ไฝฟ็”จใ—ใฆใ„ใ‚‹ๅ ดๅˆใฏใ€ใƒใƒƒใƒๅ‡ฆ็†ใ‚’่กŒใ‚ใชใ„ใงใใ ใ•ใ„ใ€‚

  • GPU ใงใ‚นใƒซใƒผใƒ—ใƒƒใƒˆใ‚’ไฝฟ็”จใ—ใฆใ„ใ‚‹ๅ ดๅˆ (ๅคง้‡ใฎ้™็š„ใƒ‡ใƒผใ‚ฟใงใƒขใƒ‡ใƒซใ‚’ๅฎŸ่กŒใ—ใŸใ„ๅ ดๅˆ)ใ€ๆฌกใฎใ‚ˆใ†ใซใ—ใพใ™ใ€‚

    • sequence_length (ใ€Œ่‡ช็„ถใชใ€ใƒ‡ใƒผใ‚ฟ) ใฎใ‚ตใ‚คใ‚บใซใคใ„ใฆใพใฃใŸใใ‚ใ‹ใ‚‰ใชใ„ๅ ดๅˆใฏใ€ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใงใฏใƒใƒƒใƒๅ‡ฆ็†ใ‚„ๆธฌๅฎšใ‚’่กŒใ‚ใšใ€ ๆšซๅฎš็š„ใซ่ฟฝๅŠ ใ—ใฆใฟใพใ™ใ€‚ๅคฑๆ•—ใ—ใŸๅ ดๅˆใซๅ›žๅพฉใ™ใ‚‹ใŸใ‚ใซ OOM ใƒใ‚งใƒƒใ‚ฏใ‚’่ฟฝๅŠ ใ—ใพใ™ (ๅคฑๆ•—ใ—ใŸๅ ดๅˆใฏใ€ใ‚ใ‚‹ๆ™‚็‚นใงๅ›žๅพฉใ—ใพใ™)ใ€‚ sequence_length ใ‚’ๅˆถๅพกใ—ใพใ™ใ€‚)
    • sequence_length ใŒ้žๅธธใซ่ฆๅ‰‡็š„ใงใ‚ใ‚‹ๅ ดๅˆใ€ใƒใƒƒใƒๅ‡ฆ็†ใฏ้žๅธธใซ่ˆˆๅ‘ณๆทฑใ„ใ‚‚ใฎใจใชใ‚‹ๅฏ่ƒฝๆ€งใŒ้ซ˜ใใ€ๆธฌๅฎšใ—ใฆใƒ—ใƒƒใ‚ทใƒฅใ—ใฆใใ ใ•ใ„ใ€‚ OOM ใŒ็™บ็”Ÿใ™ใ‚‹ใพใง็ถšใ‘ใพใ™ใ€‚
    • GPU ใŒๅคงใใ„ใปใฉใ€ใƒใƒƒใƒๅ‡ฆ็†ใŒใ‚ˆใ‚Š่ˆˆๅ‘ณๆทฑใ„ใ‚‚ใฎใซใชใ‚‹ๅฏ่ƒฝๆ€งใŒ้ซ˜ใใชใ‚Šใพใ™ใ€‚
  • ใƒใƒƒใƒๅ‡ฆ็†ใ‚’ๆœ‰ๅŠนใซใ—ใŸใ‚‰ใ™ใใซใ€OOM ใ‚’้ฉๅˆ‡ใซๅ‡ฆ็†ใงใใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚

Pipeline chunk batching

zero-shot-classification ใจ question-answering ใฏใ€ๅ˜ไธ€ใฎๅ…ฅๅŠ›ใง็ตๆžœใŒๅพ—ใ‚‰ใ‚Œใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚‹ใจใ„ใ†ๆ„ๅ‘ณใงใ€ๅฐ‘ใ—็‰นๆฎŠใงใ™ใ€‚ ใƒขใƒ‡ใƒซใฎ่ค‡ๆ•ฐใฎๅ‰ๆ–นใƒ‘ใ‚นใ€‚้€šๅธธใฎ็Šถๆณใงใฏใ€ใ“ใ‚Œใซใ‚ˆใ‚Š batch_size ๅผ•ๆ•ฐใซ้–ขใ™ใ‚‹ๅ•้กŒใŒ็™บ็”Ÿใ—ใพใ™ใ€‚

ใ“ใฎๅ•้กŒใ‚’ๅ›ž้ฟใ™ใ‚‹ใŸใ‚ใซใ€ใ“ใ‚Œใ‚‰ใฎใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฏใฉใกใ‚‰ใ‚‚ๅฐ‘ใ—็‰นๆฎŠใซใชใฃใฆใŠใ‚Šใ€ไปฃใ‚ใ‚Šใซ ChunkPipeline ใซใชใฃใฆใ„ใพใ™ใ€‚ ้€šๅธธใฎ Pipelineใ€‚่ฆใ™ใ‚‹ใซ๏ผš

preprocessed = pipe.preprocess(inputs)
model_outputs = pipe.forward(preprocessed)
outputs = pipe.postprocess(model_outputs)

ไปŠใฏๆฌกใฎใ‚ˆใ†ใซใชใ‚Šใพใ™:

all_model_outputs = []
for preprocessed in pipe.preprocess(inputs):
    model_outputs = pipe.forward(preprocessed)
    all_model_outputs.append(model_outputs)
outputs = pipe.postprocess(all_model_outputs)

ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฏไปฅไธ‹ใงไฝฟ็”จใ•ใ‚Œใ‚‹ใŸใ‚ใ€ใ“ใ‚Œใฏใ‚ณใƒผใƒ‰ใซๅฏพใ—ใฆ้žๅธธใซ้€้Ž็š„ใงใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ ๅŒใ˜ๆ–นๆณ•ใ€‚

ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฏใƒใƒƒใƒใ‚’่‡ชๅ‹•็š„ใซๅ‡ฆ็†ใงใใ‚‹ใŸใ‚ใ€ใ“ใ‚Œใฏ็ฐก็•ฅๅŒ–ใ•ใ‚ŒใŸใƒ“ใƒฅใƒผใงใ™ใ€‚ๆฐ—ใซใ™ใ‚‹ๅฟ…่ฆใฏใชใ„ใจใ„ใ†ๆ„ๅ‘ณใงใ™ ๅ…ฅๅŠ›ใŒๅฎŸ้š›ใซใƒˆใƒชใ‚ฌใƒผใ™ใ‚‹ๅ‰ๆ–นใƒ‘ใ‚นใฎๆ•ฐใซใคใ„ใฆใฏใ€batch_size ใ‚’ๆœ€้ฉๅŒ–ใงใใพใ™ใ€‚ ๅ…ฅๅŠ›ใจใฏ็‹ฌ็ซ‹ใ—ใฆใ€‚ๅ‰ใฎใ‚ปใ‚ฏใ‚ทใƒงใƒณใฎๆณจๆ„ไบ‹้ …ใŒๅผ•ใ็ถšใ้ฉ็”จใ•ใ‚Œใพใ™ใ€‚

Pipeline custom code

็‰นๅฎšใฎใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใ‚’ใ‚ชใƒผใƒใƒผใƒฉใ‚คใƒ‰ใ™ใ‚‹ๅ ดๅˆใ€‚

็›ฎใฎๅ‰ใฎใ‚ฟใ‚นใ‚ฏใซ้–ขใ™ใ‚‹ๅ•้กŒใ‚’ไฝœๆˆใ™ใ‚‹ใ“ใจใ‚’่บŠ่บ‡ใ—ใชใ„ใงใใ ใ•ใ„ใ€‚ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใฎ็›ฎๆจ™ใฏใ€ไฝฟใ„ใ‚„ใ™ใใ€ใปใจใ‚“ใฉใฎใƒฆใƒผใ‚ถใƒผใ‚’ใ‚ตใƒใƒผใƒˆใ™ใ‚‹ใ“ใจใงใ™ใ€‚ ใ—ใŸใŒใฃใฆใ€transformersใŒใ‚ใชใŸใฎใƒฆใƒผใ‚นใ‚ฑใƒผใ‚นใ‚’ใ‚ตใƒใƒผใƒˆใ™ใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚

ๅ˜็ด”ใซ่ฉฆใ—ใฆใฟใŸใ„ๅ ดๅˆใฏใ€ๆฌกใฎใ“ใจใŒใงใใพใ™ใ€‚

  • ้ธๆŠžใ—ใŸใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใ‚’ใ‚ตใƒ–ใ‚ฏใƒฉใ‚นๅŒ–ใ—ใพใ™
class MyPipeline(TextClassificationPipeline):
    def postprocess():
        # Your code goes here
        scores = scores * 100
        # And here


my_pipeline = MyPipeline(model=model, tokenizer=tokenizer, ...)
# or if you use *pipeline* function, then:
my_pipeline = pipeline(model="xxxx", pipeline_class=MyPipeline)

ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ๅฟ…่ฆใชใ‚ซใ‚นใ‚ฟใƒ  ใ‚ณใƒผใƒ‰ใ‚’ใ™ในใฆๅฎŸ่กŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚

Implementing a pipeline

Implementing a new pipeline

Audio

ใ‚ชใƒผใƒ‡ใ‚ฃใ‚ช ใ‚ฟใ‚นใ‚ฏใซไฝฟ็”จใงใใ‚‹ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใซใฏๆฌกใฎใ‚‚ใฎใŒใ‚ใ‚Šใพใ™ใ€‚

AudioClassificationPipeline

[[autodoc]] AudioClassificationPipeline - call - all

AutomaticSpeechRecognitionPipeline

[[autodoc]] AutomaticSpeechRecognitionPipeline - call - all

TextToAudioPipeline

[[autodoc]] TextToAudioPipeline - call - all

ZeroShotAudioClassificationPipeline

[[autodoc]] ZeroShotAudioClassificationPipeline - call - all

Computer vision

ใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใƒผ ใƒ“ใ‚ธใƒงใƒณ ใ‚ฟใ‚นใ‚ฏใซไฝฟ็”จใงใใ‚‹ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใซใฏๆฌกใฎใ‚‚ใฎใŒใ‚ใ‚Šใพใ™ใ€‚

DepthEstimationPipeline

[[autodoc]] DepthEstimationPipeline - call - all

ImageClassificationPipeline

[[autodoc]] ImageClassificationPipeline - call - all

ImageSegmentationPipeline

[[autodoc]] ImageSegmentationPipeline - call - all

ImageToImagePipeline

[[autodoc]] ImageToImagePipeline - call - all

ObjectDetectionPipeline

[[autodoc]] ObjectDetectionPipeline - call - all

VideoClassificationPipeline

[[autodoc]] VideoClassificationPipeline - call - all

ZeroShotImageClassificationPipeline

[[autodoc]] ZeroShotImageClassificationPipeline - call - all

ZeroShotObjectDetectionPipeline

[[autodoc]] ZeroShotObjectDetectionPipeline - call - all

Natural Language Processing

่‡ช็„ถ่จ€่ชžๅ‡ฆ็†ใ‚ฟใ‚นใ‚ฏใซไฝฟ็”จใงใใ‚‹ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใซใฏๆฌกใฎใ‚‚ใฎใŒใ‚ใ‚Šใพใ™ใ€‚

FillMaskPipeline

[[autodoc]] FillMaskPipeline - call - all

NerPipeline

[[autodoc]] NerPipeline

่ฉณ็ดฐใซใคใ„ใฆใฏใ€[TokenClassificationPipeline] ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚

QuestionAnsweringPipeline

[[autodoc]] QuestionAnsweringPipeline - call - all

SummarizationPipeline

[[autodoc]] SummarizationPipeline - call - all

TableQuestionAnsweringPipeline

[[autodoc]] TableQuestionAnsweringPipeline - call

TextClassificationPipeline

[[autodoc]] TextClassificationPipeline - call - all

TextGenerationPipeline

[[autodoc]] TextGenerationPipeline - call - all

Text2TextGenerationPipeline

[[autodoc]] Text2TextGenerationPipeline - call - all

TokenClassificationPipeline

[[autodoc]] TokenClassificationPipeline - call - all

TranslationPipeline

[[autodoc]] TranslationPipeline - call - all

ZeroShotClassificationPipeline

[[autodoc]] ZeroShotClassificationPipeline - call - all

Multimodal

ใƒžใƒซใƒใƒขใƒผใƒ€ใƒซ ใ‚ฟใ‚นใ‚ฏใซไฝฟ็”จใงใใ‚‹ใƒ‘ใ‚คใƒ—ใƒฉใ‚คใƒณใซใฏๆฌกใฎใ‚‚ใฎใŒใ‚ใ‚Šใพใ™ใ€‚

DocumentQuestionAnsweringPipeline

[[autodoc]] DocumentQuestionAnsweringPipeline - call - all

FeatureExtractionPipeline

[[autodoc]] FeatureExtractionPipeline - call - all

ImageFeatureExtractionPipeline

[[autodoc]] ImageFeatureExtractionPipeline - call - all

ImageToTextPipeline

[[autodoc]] ImageToTextPipeline - call - all

ImageTextToTextPipeline

[[autodoc]] ImageTextToTextPipeline - call - all

VisualQuestionAnsweringPipeline

[[autodoc]] VisualQuestionAnsweringPipeline - call - all

Parent class: Pipeline

[[autodoc]] Pipeline