Skip to content

Commit ab0b614

Browse files
authored
Merge pull request #8 from isabelizimm/write-docker-file
Write docker file
2 parents a50cf47 + 071d10e commit ab0b614

27 files changed

Lines changed: 729 additions & 52 deletions

examples/coffeeratings.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import pandas as pd
2+
from sklearn import model_selection
3+
from sklearn.linear_model import LinearRegression
4+
import vetiver
5+
from vetiver.pin_read_write import vetiver_pin_write
6+
from pathlib import Path
7+
8+
# Load training data
9+
raw = pd.read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-07-07/coffee_ratings.csv')
10+
df = pd.DataFrame(raw)
11+
coffee = df[["total_cup_points", "aroma", "flavor", "sweetness", "acidity", \
12+
"body", "uniformity", "balance"]].dropna()
13+
14+
X_train, X_test, y_train, y_test = model_selection.train_test_split(coffee.iloc[:,1:],coffee['total_cup_points'],test_size=0.2)
15+
16+
# fit model
17+
lr_fit = LinearRegression().fit(X_train, y_train)
18+
19+
# create vetiver model
20+
v = vetiver.VetiverModel(lr_fit, save_ptype = True, ptype_data=X_train, model_name = "v")
21+
22+
# version model via pin
23+
from pins import board_folder
24+
25+
path = "./examples/coffeeratings/"
26+
27+
model_board = board_folder(path=path, versioned=True, allow_pickle_read=True)
28+
vetiver_pin_write(board=model_board, model=v)
29+
30+
myapp = vetiver.VetiverAPI(v, check_ptype = True)
31+
api = myapp.app
32+
33+
# next, run myapp.run() to start API and see visual documentation
34+
# create app.py file that includes pinned VetiverAPI to be deployed
35+
vetiver.vetiver_write_app(model_board, "v", file = path+"app.py")
36+
37+
# automatically create requirements.txt
38+
vetiver.load_pkgs(model=v, path=path)
39+
40+
# write Dockerfile
41+
vetiver.vetiver_write_docker(path=path, host="0.0.0.0", port="80")
42+
43+
## to run Dockerfile, in CLI
44+
# cd ./coffeeratings
45+
# docker build -t myimage .
46+
# docker run -d --name mycontainer -p 80:80 myimage

examples/coffeeratings/Dockerfile

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# # Generated by the vetiver package; edit with care
2+
#
3+
FROM python:3.8
4+
5+
#
6+
WORKDIR /code
7+
8+
#
9+
COPY vetiver_requirements.txt /code/requirements.txt
10+
11+
#
12+
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
13+
14+
# edited to copy all information into Dockerfile
15+
COPY . /code/app
16+
17+
#
18+
CMD ["uvicorn", "app.app:api", "--host", "0.0.0.0", "--port", "80"]

examples/coffeeratings/app.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import vetiver
2+
import pins
3+
4+
# edited to reflect Docker container path, and allow_pickle_read=True
5+
b = pins.board_folder('/code/app', allow_pickle_read=True)
6+
v = vetiver.vetiver_pin_read(b, 'v', version = '20220415T174503Z-06d9b')
7+
8+
vetiver_api = vetiver.VetiverAPI(v)
9+
api = vetiver_api.app
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
api_version: 1
2+
created: 20220415T174503Z
3+
description: Scikit-learn model of type <class 'sklearn.linear_model._base.LinearRegression'>
4+
file: v.joblib
5+
file_size: 1035
6+
pin_hash: 06d9b5c677c7dcd0
7+
title: 'v: a pinned LinearRegression object'
8+
type: joblib
9+
user:
10+
ptype: '{"aroma": 7.5, "flavor": 7.67, "sweetness": 10.0, "acidity": 7.67, "body":
11+
7.58, "uniformity": 10.0, "balance": 7.42}'
12+
required_pkgs:
13+
- vetiver
14+
- scikit-learn
15+
save_ptype: true
1.01 KB
Binary file not shown.
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#
2+
# This file is autogenerated by pip-compile with python 3.8
3+
# To update, run:
4+
#
5+
# pip-compile --output-file=./examples/coffeeratings/vetiver_requirements.txt /var/folders/5w/dhznpltj14n3nxr4fybjj8_w0000gn/T/tmpwe9ooski.in
6+
#
7+
anyio==3.5.0
8+
# via starlette
9+
asgiref==3.5.0
10+
# via uvicorn
11+
certifi==2021.10.8
12+
# via requests
13+
charset-normalizer==2.0.12
14+
# via requests
15+
click==8.1.2
16+
# via uvicorn
17+
fastapi==0.75.1
18+
# via vetiver
19+
h11==0.13.0
20+
# via uvicorn
21+
idna==3.3
22+
# via
23+
# anyio
24+
# requests
25+
joblib==1.1.0
26+
# via
27+
# scikit-learn
28+
# vetiver
29+
nest-asyncio==1.5.5
30+
# via vetiver
31+
numpy==1.22.3
32+
# via
33+
# pandas
34+
# scikit-learn
35+
# scipy
36+
# vetiver
37+
pandas==1.4.2
38+
# via vetiver
39+
pydantic==1.9.0
40+
# via
41+
# fastapi
42+
# vetiver
43+
python-dateutil==2.8.2
44+
# via pandas
45+
pytz==2022.1
46+
# via pandas
47+
requests==2.27.1
48+
# via vetiver
49+
scikit-learn==1.0.2
50+
# via
51+
# -r /var/folders/5w/dhznpltj14n3nxr4fybjj8_w0000gn/T/tmpwe9ooski.in
52+
# vetiver
53+
scipy==1.8.0
54+
# via scikit-learn
55+
six==1.16.0
56+
# via python-dateutil
57+
sniffio==1.2.0
58+
# via anyio
59+
starlette==0.17.1
60+
# via fastapi
61+
threadpoolctl==3.1.0
62+
# via scikit-learn
63+
torch==1.11.0
64+
# via vetiver
65+
typing-extensions==4.1.1
66+
# via
67+
# pydantic
68+
# torch
69+
urllib3==1.26.9
70+
# via requests
71+
uvicorn==0.17.6
72+
# via vetiver
73+
74+
# manually edited to reflect appropriate versions of packages currently being developed
75+
git+https://github.com/isabelizimm/vetiver-python.git@37dff15a63238b1e6c44788af70473f19c29d83e

requirements/dev.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,5 @@ uvicorn==0.17.6
166166
# via vetiver (setup.py)
167167
zipp==3.7.0
168168
# via importlib-metadata
169+
# manually added
170+
git+https://github.com/machow/pins-python.git

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ install_requires =
3333
nest-asyncio
3434
torch
3535
requests
36+
pins @ git+https://github.com/machow/pins-python@f9391b5937b3a13b2a2c841855ca94ab281b2cef
3637

3738
[options.extras_require]
3839
dev =

vetiver/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,16 @@
44
__author__ = "Isabel Zimmerman <isabel.zimmerman@rstudio.com>"
55
__all__ = []
66

7+
import importlib
78
from .ptype import *
89
from .vetiver_model import *
910
from .server import *
1011
from .mock import *
12+
from .pin_read_write import *
13+
from .attach_pkgs import *
14+
from .meta import *
15+
from .write_docker import *
16+
from .write_fastapi import *
17+
from .handlers._interface import *
18+
from .handlers.sklearn_vt import *
19+
from .handlers.pytorch_vt import *

vetiver/attach_pkgs.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import tempfile
2+
import os
3+
from vetiver import VetiverModel
4+
5+
def load_pkgs(model: VetiverModel = None, packages: list = None, path=""):
6+
"""Load packages necessary for predictions
7+
8+
Args
9+
----
10+
model: VetiverModel
11+
VetiverModel to extract packages from
12+
packages: list
13+
List of extra packages to include
14+
path: str
15+
Where to save output file
16+
"""
17+
18+
required_pkgs = ["vetiver"]
19+
if packages:
20+
required_pkgs = list(set(required_pkgs + packages))
21+
if model.metadata.get("required_pkgs"):
22+
required_pkgs = list(set(required_pkgs + model.metadata.get("required_pkgs")))
23+
24+
25+
tmp = tempfile.NamedTemporaryFile(suffix='.in')
26+
27+
with open(tmp.name, 'a') as f:
28+
for package in required_pkgs:
29+
f.write(package + '\n')
30+
31+
os.system(f"pip-compile {f.name} --output-file={path}vetiver_requirements.txt")

0 commit comments

Comments
 (0)