Source: examples/cog
Example: Cog + SkyPilot#
Use SkyPilot to self-host any Cog-packaged projects.
This is the “Blur” example from replicate/cog-examples
Serve using a single instance#
sky launch -c cog ./sky.yaml
IP=$(sky status --ip cog)
curl http://$IP:5000/predictions -X POST \
-H 'Content-Type: application/json' \
-d '{"input": {"image": "https://blog.skypilot.co/introducing-sky-serve/images/sky-serve-thumbnail.png"}}' \
| jq -r '.output | split(",")[1]' | base64 --decode > output.png
Scale up the deployment using SkyServe#
We can use SkyServe (sky serve) to scale up the deployment to multiple instances, while enjoying load balancing, autoscaling, and other SkyServe features.
sky serve up -n cog ./sky.yaml
Notice the only change is from sky launch to sky serve up. The same YAML can be used without changes.
After the service is launched, access the deployment with the following:
ENDPOINT=$(sky serve status --endpoint cog)
curl http://$ENDPOINT/predictions -X POST \
-H 'Content-Type: application/json' \
-d '{"input": {"image": "https://blog.skypilot.co/introducing-sky-serve/images/sky-serve-thumbnail.png"}}' \
| jq -r '.output | split(",")[1]' | base64 --decode > output.png
Included files#
cog.yaml
build:
python_version: "3.8"
python_packages:
- "pillow==8.2.0"
system_packages:
- "libpng-dev"
- "libjpeg-dev"
predict: "predict.py:Predictor"
import tempfile
import cog
from PIL import Image
from PIL import ImageFilter
class Predictor(cog.BasePredictor):
def predict(
self,
image: cog.Path = cog.Input(description='Input image'),
blur: float = cog.Input(description='Blur radius', default=5),
) -> cog.Path:
if blur == 0:
return input
im = Image.open(str(image))
im = im.filter(ImageFilter.BoxBlur(blur))
out_path = cog.Path(tempfile.mkdtemp()) / 'out.png'
im.save(str(out_path))
return out_path
sky.yaml
# Example: Cog + SkyPilot.
#
# This is the "Blur" example from https://github.com/replicate/cog-examples/blob/main/blur/README.md
#
# Usage (1 serving instance):
#
# sky launch -c cog ./sky.yaml
#
# IP=$(sky status --ip cog)
# curl http://$IP:5000/predictions -X POST \
# -H 'Content-Type: application/json' \
# -d '{"input": {"image": "https://blog.skypilot.co/introducing-sky-serve/images/sky-serve-thumbnail.png"}}' \
# | jq -r '.output | split(",")[1]' | base64 --decode > output.png
#
# Usage (SkyServe): See README.md
service:
readiness_probe:
path: /predictions
post_data:
input: {"image": "https://blog.skypilot.co/introducing-sky-serve/images/sky-serve-thumbnail.png"}
replicas: 2
resources:
accelerators: {L4, T4, A10G}
ports:
- 5000
workdir: .
setup: |
set -e
sudo curl -o /usr/local/bin/cog -L "https://github.com/replicate/cog/releases/latest/download/cog_$(uname -s)_$(uname -m)"
sudo chmod +x /usr/local/bin/cog
cog build -t my-model
run: |
docker run -d -p 5000:5000 --gpus all my-model