Application#
# Define app.
api = FastAPI(
title="doggos",
description="classify your dog",
version="0.1",
)
@serve.deployment
@serve.ingress(api)
class Doggos:
def __init__(self, classifier):
self.classifier = classifier
@api.post("/predict/")
async def predict(self, request: Request):
data = await request.json()
probabilities = await self.classifier.get_probabilities.remote(url=data["url"])
return probabilities
# Model registry.
model_registry = "/mnt/cluster_storage/mlflow/doggos"
experiment_name = "doggos"
mlflow.set_tracking_uri(f"file:{model_registry}")
# Get best_run's artifact_dir.
sorted_runs = mlflow.search_runs(
experiment_names=[experiment_name],
order_by=["metrics.val_loss ASC"])
best_run = sorted_runs.iloc[0]
artifacts_dir = urlparse(best_run.artifact_uri).path
# Define app.
app = Doggos.bind(
classifier=ClassPredictor.bind(
model_id="openai/clip-vit-base-patch32",
artifacts_dir=artifacts_dir,
device="cuda"
)
)
# Run service locally.
serve.run(app, route_prefix="/")
DeploymentHandle(deployment='Doggos')
# Send a request.
url = "https://doggos-dataset.s3.us-west-2.amazonaws.com/samara.png"
data = {"url": url}
response = requests.post("http://127.0.0.1:8000/predict/", json=data)
probabilities = response.json()["probabilities"]
sorted_probabilities = sorted(probabilities.items(), key=lambda x: x[1], reverse=True)
sorted_probabilities[0:3]
[('collie', 0.2292557954788208),
('border_collie', 0.1228194534778595),
('german_shepherd', 0.07383470982313156)]
(autoscaler +13m35s) Tip: use `ray status` to view detailed cluster status. To disable these messages, set RAY_SCHEDULER_EVENTS=0.