|
"""Test the HuggingFace API.""" |
|
|
|
import math |
|
import os |
|
from subprocess import PIPE, Popen |
|
|
|
import numpy as np |
|
import pytest |
|
|
|
from manifest.api.models.huggingface import MODEL_REGISTRY, TextGenerationModel |
|
from manifest.api.models.sentence_transformer import SentenceTransformerModel |
|
|
|
NOCUDA = 0 |
|
try: |
|
p = Popen( |
|
[ |
|
"nvidia-smi", |
|
( |
|
"--query-gpu=index,utilization.gpu,memory.total,memory.used," |
|
"memory.free,driver_version,name,gpu_serial,display_active," |
|
"display_mode" |
|
), |
|
"--format=csv,noheader,nounits", |
|
], |
|
stdout=PIPE, |
|
) |
|
except OSError: |
|
NOCUDA = 1 |
|
|
|
MAXGPU = 0 |
|
if NOCUDA == 0: |
|
try: |
|
p = os.popen( |
|
"nvidia-smi --query-gpu=index --format=csv,noheader,nounits" |
|
) |
|
i = p.read().split("\n") |
|
MAXGPU = int(i[-2]) + 1 |
|
except OSError: |
|
NOCUDA = 1 |
|
|
|
|
|
def test_load_non_registry_model() -> None: |
|
"""Test load model not in registry.""" |
|
model_name = "NinedayWang/PolyCoder-160M" |
|
assert model_name not in MODEL_REGISTRY |
|
model = TextGenerationModel( |
|
model_name_or_path=model_name, model_type="text-generation" |
|
) |
|
result = model.generate("Why is the sky green?", max_tokens=10) |
|
assert result is not None |
|
|
|
|
|
def test_gpt_generate() -> None: |
|
"""Test pipeline generation from a gpt model.""" |
|
model = TextGenerationModel( |
|
model_name_or_path="gpt2", |
|
use_accelerate=False, |
|
use_parallelize=False, |
|
use_bitsandbytes=False, |
|
use_deepspeed=False, |
|
use_fp16=False, |
|
device=-1, |
|
) |
|
inputs = "Why is the sky green?" |
|
result = model.generate(inputs, max_tokens=10) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == "\n\nThe sky is green.\n\nThe" |
|
assert math.isclose(round(result[0][1], 3), -11.516) |
|
|
|
result = model.generate("Cats are", max_tokens=10) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == " not the only ones who are being targeted by the" |
|
assert math.isclose(round(result[0][1], 3), -21.069) |
|
|
|
result = model.generate(inputs, max_tokens=5) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == "\n\nThe sky is" |
|
assert math.isclose(round(result[0][1], 3), -6.046) |
|
|
|
|
|
model.pipeline.max_length = 5 |
|
result = model.generate(inputs, max_tokens=2) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == "\n\n" |
|
assert math.isclose(round(result[0][1], 3), -1.414) |
|
|
|
|
|
def test_encdec_generate() -> None: |
|
"""Test pipeline generation from a gpt model.""" |
|
model = TextGenerationModel( |
|
model_name_or_path="google/t5-small-lm-adapt", |
|
use_accelerate=False, |
|
use_parallelize=False, |
|
use_bitsandbytes=False, |
|
use_deepspeed=False, |
|
use_fp16=False, |
|
device=-1, |
|
) |
|
inputs = "Why is the sky green?" |
|
result = model.generate(inputs, max_tokens=10) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == "What is the sky green? What is the sky" |
|
assert math.isclose(round(result[0][1], 3), -7.271) |
|
|
|
result = model.generate("Cats are", max_tokens=10) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == "a great way to get out of the house" |
|
assert math.isclose(round(result[0][1], 3), -13.868) |
|
|
|
result = model.generate(inputs, max_tokens=5) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == "What is the sky green" |
|
assert math.isclose(round(result[0][1], 3), -5.144) |
|
|
|
|
|
model.pipeline.max_length = 5 |
|
result = model.generate(inputs, max_tokens=2) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == "Is" |
|
assert math.isclose(round(result[0][1], 3), -4.233) |
|
|
|
|
|
def test_gpt_score() -> None: |
|
"""Test pipeline generation from a gpt model.""" |
|
model = TextGenerationModel( |
|
model_name_or_path="gpt2", |
|
use_accelerate=False, |
|
use_parallelize=False, |
|
use_bitsandbytes=False, |
|
use_deepspeed=False, |
|
use_fp16=False, |
|
device=-1, |
|
) |
|
inputs = ["Why is the sky green?", "Cats are butterflies"] |
|
result = model.score_sequence(inputs) |
|
assert result is not None |
|
assert len(result) == 2 |
|
assert math.isclose(round(result[0][0], 3), -46.71) |
|
assert math.isclose(round(result[1][0], 3), -12.752) |
|
assert isinstance(result[0][1], list) |
|
assert isinstance(result[1][1], list) |
|
|
|
|
|
def test_embed() -> None: |
|
"""Test embedding pipeline.""" |
|
model = TextGenerationModel( |
|
model_name_or_path="gpt2", |
|
use_accelerate=False, |
|
use_parallelize=False, |
|
use_bitsandbytes=False, |
|
use_deepspeed=False, |
|
use_fp16=False, |
|
device=-1, |
|
) |
|
inputs = ["Why is the sky green?", "Cats are butterflies"] |
|
embeddings = model.embed(inputs) |
|
assert isinstance(embeddings, np.ndarray) |
|
assert embeddings.shape == (2, 768) |
|
|
|
model2 = SentenceTransformerModel( |
|
model_name_or_path="all-mpnet-base-v2", |
|
use_accelerate=False, |
|
use_parallelize=False, |
|
use_bitsandbytes=False, |
|
use_deepspeed=False, |
|
use_fp16=False, |
|
device=-1, |
|
) |
|
inputs = ["Why is the sky green?", "Cats are butterflies"] |
|
embeddings = model2.embed(inputs) |
|
assert isinstance(embeddings, np.ndarray) |
|
assert embeddings.shape == (2, 768) |
|
|
|
|
|
def test_batch_gpt_generate() -> None: |
|
"""Test pipeline generation from a gpt model.""" |
|
model = TextGenerationModel( |
|
model_name_or_path="gpt2", |
|
use_accelerate=False, |
|
use_parallelize=False, |
|
use_bitsandbytes=False, |
|
use_deepspeed=False, |
|
use_fp16=False, |
|
device=-1, |
|
) |
|
inputs = ["Why is the sky green?", "Cats are"] |
|
result = model.generate(inputs, max_tokens=10) |
|
assert result is not None |
|
assert len(result) == 2 |
|
assert result[0][0] == "\n\nThe sky is green.\n\nThe" |
|
assert math.isclose(round(result[0][1], 3), -11.516) |
|
assert result[1][0] == " not the only ones who are being targeted by the" |
|
assert math.isclose(round(result[1][1], 3), -21.069) |
|
|
|
result = model.generate(inputs, max_tokens=5) |
|
assert result is not None |
|
assert len(result) == 2 |
|
assert result[0][0] == "\n\nThe sky is" |
|
assert math.isclose(round(result[0][1], 2), -6.05) |
|
assert result[1][0] == " not the only ones who" |
|
assert math.isclose(round(result[1][1], 3), -9.978) |
|
|
|
|
|
model.pipeline.max_length = 5 |
|
result = model.generate(inputs, max_tokens=2) |
|
assert result is not None |
|
assert len(result) == 2 |
|
assert result[0][0] == "\n\n" |
|
assert math.isclose(round(result[0][1], 3), -1.414) |
|
assert result[1][0] == " not the" |
|
assert math.isclose(round(result[1][1], 3), -6.246) |
|
|
|
|
|
def test_batch_encdec_generate() -> None: |
|
"""Test pipeline generation from a gpt model.""" |
|
model = TextGenerationModel( |
|
model_name_or_path="google/t5-small-lm-adapt", |
|
use_accelerate=False, |
|
use_parallelize=False, |
|
use_bitsandbytes=False, |
|
use_deepspeed=False, |
|
use_fp16=False, |
|
device=-1, |
|
) |
|
inputs = ["Why is the sky green?", "Cats are"] |
|
result = model.generate(inputs, max_tokens=10) |
|
assert result is not None |
|
assert len(result) == 2 |
|
assert result[0][0] == "What is the sky green? What is the sky" |
|
assert math.isclose(round(result[0][1], 3), -7.271) |
|
assert result[1][0] == "a great way to get out of the house" |
|
assert math.isclose(round(result[1][1], 3), -13.868) |
|
|
|
result = model.generate(inputs, max_tokens=5) |
|
assert result is not None |
|
assert len(result) == 2 |
|
assert result[0][0] == "What is the sky green" |
|
assert math.isclose(round(result[0][1], 3), -5.144) |
|
assert result[1][0] == "a great way to" |
|
assert math.isclose(round(result[1][1], 3), -6.353) |
|
|
|
|
|
model.pipeline.max_length = 5 |
|
result = model.generate(inputs, max_tokens=2) |
|
assert result is not None |
|
assert len(result) == 2 |
|
assert result[0][0] == "Is" |
|
assert math.isclose(round(result[0][1], 3), -4.233) |
|
assert result[1][0] == "a" |
|
assert math.isclose(round(result[1][1], 3), -1.840) |
|
|
|
|
|
@pytest.mark.skipif( |
|
(NOCUDA == 1 or MAXGPU == 0), reason="No cuda or GPUs found through nvidia-smi" |
|
) |
|
def test_gpt_deepspeed_generate() -> None: |
|
"""Test deepspeed generation from a gpt model.""" |
|
model = TextGenerationModel( |
|
model_name_or_path="gpt2", |
|
use_accelerate=False, |
|
use_parallelize=False, |
|
use_bitsandbytes=False, |
|
use_deepspeed=True, |
|
use_fp16=False, |
|
device=0, |
|
) |
|
inputs = "Why is the sky green?" |
|
result = model.generate(inputs, max_tokens=10) |
|
assert result is not None |
|
assert len(result) == 1 |
|
assert result[0][0] == "\n\nThe sky is green.\n\nThe" |
|
assert math.isclose(round(result[0][1], 3), -11.517) |
|
|