|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import torch |
|
|
|
from fastapi import FastAPI, Path, Request |
|
import logging |
|
import sys |
|
|
|
from .translation_task import TranslationTaskService |
|
from .classification import ClassificationTaskService |
|
from .text_to_image import TextToImageTaskService |
|
|
|
app = FastAPI( |
|
title="Pimcore Local Inference Service", |
|
description="This services allows HF inference provider compatible inference to models which are not available at HF inference providers.", |
|
version="1.0.0" |
|
) |
|
|
|
logging.basicConfig(format='%(asctime)s %(levelname)-8s %(message)s') |
|
logger = logging.getLogger(__name__) |
|
logger.setLevel(logging.DEBUG) |
|
|
|
|
|
class StreamToLogger(object): |
|
def __init__(self, logger, log_level): |
|
self.logger = logger |
|
self.log_level = log_level |
|
self.linebuf = '' |
|
|
|
def write(self, buf): |
|
for line in buf.rstrip().splitlines(): |
|
self.logger.log(self.log_level, line.rstrip()) |
|
|
|
def flush(self): |
|
pass |
|
|
|
sys.stdout = StreamToLogger(logger, logging.INFO) |
|
sys.stderr = StreamToLogger(logger, logging.ERROR) |
|
|
|
@app.get("/gpu_check") |
|
async def gpu_check(): |
|
""" Check if a GPU is available """ |
|
|
|
gpu = 'GPU not available' |
|
if torch.cuda.is_available(): |
|
gpu = 'GPU is available' |
|
print("GPU is available") |
|
else: |
|
print("GPU is not available") |
|
|
|
return {'success': True, 'gpu': gpu} |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
"/translation/{model_name:path}", |
|
openapi_extra={ |
|
"requestBody": { |
|
"content": { |
|
"application/json": { |
|
"example": { |
|
"inputs": "Hello, world! foo bar", |
|
"parameters": {"repetition_penalty": 1.6} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
) |
|
async def translate( |
|
request: Request, |
|
model_name: str = Path( |
|
..., |
|
description="The name of the translation model (e.g. Helsinki-NLP/opus-mt-en-de)", |
|
example="Helsinki-NLP/opus-mt-en-de" |
|
) |
|
): |
|
""" |
|
Execute translation tasks. |
|
|
|
Returns: |
|
list: The translation result(s) as returned by the pipeline. |
|
""" |
|
|
|
model_name = model_name.rstrip("/") |
|
translationTaskService = TranslationTaskService(logger) |
|
return await translationTaskService.translate(request, model_name) |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
"/zero-shot-image-classification/{model_name:path}", |
|
openapi_extra={ |
|
"requestBody": { |
|
"content": { |
|
"application/json": { |
|
"example": { |
|
"inputs": "base64_encoded_image_string", |
|
"parameters": {"candidate_labels": "green, yellow, blue, white, silver"} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
) |
|
async def zero_shot_image_classification( |
|
request: Request, |
|
model_name: str = Path( |
|
..., |
|
description="The name of the zero-shot classification model (e.g., openai/clip-vit-large-patch14-336)", |
|
example="openai/clip-vit-large-patch14-336" |
|
) |
|
): |
|
""" |
|
Execute zero-shot image classification tasks. |
|
|
|
Returns: |
|
list: The classification result(s) as returned by the pipeline. |
|
""" |
|
|
|
model_name = model_name.rstrip("/") |
|
zeroShotTask = ClassificationTaskService(logger, 'zero-shot-image-classification') |
|
return await zeroShotTask.classify(request, model_name) |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
"/image-classification/{model_name:path}", |
|
openapi_extra={ |
|
"requestBody": { |
|
"content": { |
|
"application/json": { |
|
"example": { |
|
"inputs": "base64_encoded_image_string" |
|
} |
|
} |
|
} |
|
} |
|
} |
|
) |
|
async def image_classification( |
|
request: Request, |
|
model_name: str = Path( |
|
..., |
|
description="The name of the image classification model (e.g., pimcore/car-countries-classification)", |
|
example="pimcore/car-countries-classification" |
|
) |
|
): |
|
""" |
|
Execute image classification tasks. |
|
|
|
Returns: |
|
list: The classification result(s) as returned by the pipeline. |
|
""" |
|
|
|
model_name = model_name.rstrip("/") |
|
imageTask = ClassificationTaskService(logger, 'image-classification') |
|
return await imageTask.classify(request, model_name) |
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
"/zero-shot-text-classification/{model_name:path}", |
|
openapi_extra={ |
|
"requestBody": { |
|
"content": { |
|
"application/json": { |
|
"example": { |
|
"inputs": "text to classify", |
|
"parameters": {"candidate_labels": "green, yellow, blue, white, silver"} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
) |
|
async def zero_shot_text_classification( |
|
request: Request, |
|
model_name: str = Path( |
|
..., |
|
description="The name of the zero-shot text classification model (e.g., facebook/bart-large-mnli)", |
|
example="facebook/bart-large-mnli" |
|
) |
|
): |
|
""" |
|
Execute zero-shot text classification tasks. |
|
|
|
Returns: |
|
list: The classification result(s) as returned by the pipeline. |
|
""" |
|
|
|
model_name = model_name.rstrip("/") |
|
zeroShotTask = ClassificationTaskService(logger, 'zero-shot-classification') |
|
return await zeroShotTask.classify(request, model_name) |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
"/text-classification/{model_name:path}", |
|
openapi_extra={ |
|
"requestBody": { |
|
"content": { |
|
"application/json": { |
|
"example": { |
|
"inputs": "text to classify" |
|
} |
|
} |
|
} |
|
} |
|
} |
|
) |
|
async def text_classification( |
|
request: Request, |
|
model_name: str = Path( |
|
..., |
|
description="The name of the text classification model (e.g., pimcore/car-class-classification)", |
|
example="pimcore/car-class-classification" |
|
) |
|
): |
|
""" |
|
Execute text classification tasks. |
|
|
|
Returns: |
|
list: The classification result(s) as returned by the pipeline. |
|
""" |
|
|
|
model_name = model_name.rstrip("/") |
|
textTask = ClassificationTaskService(logger, 'text-classification') |
|
return await textTask.classify(request, model_name) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
"/image-to-text/{model_name:path}", |
|
openapi_extra={ |
|
"requestBody": { |
|
"content": { |
|
"multipart/form-data": { |
|
"schema": { |
|
"type": "object", |
|
"properties": { |
|
"image": { |
|
"type": "string", |
|
"format": "binary", |
|
"description": "Image file to upload" |
|
} |
|
}, |
|
"required": ["image"] |
|
} |
|
} |
|
} |
|
} |
|
} |
|
) |
|
async def image_to_text( |
|
request: Request, |
|
model_name: str = Path( |
|
..., |
|
description="The name of the image-to-text (e.g., Salesforce/blip-image-captioning-base)", |
|
example="Salesforce/blip-image-captioning-base" |
|
) |
|
): |
|
""" |
|
Execute image-to-text tasks. |
|
|
|
Returns: |
|
list: The generated text as returned by the pipeline. |
|
""" |
|
|
|
model_name = model_name.rstrip("/") |
|
imageToTextTask = TextToImageTaskService(logger) |
|
return await imageToTextTask.extract(request, model_name) |
|
|