Beginner Computer Vision: Episode 6
You can retrieve data produced in any runs, from any compute environment, using the Metaflow client API in whatever downstream application you want. Another use case for the API is ad-hoc testing. In this episode, you will see how to access the best model trained in your TuningFlow
with the client API and use the model to make a prediction.
1Write a Prediction Flow
This flow shows how you can:
- Access the latest
TuningFlow
that has been tagged withproduction
. - Use the
best_model
from that flow run to make a prediction on a test image. - Produce a card showing the true label, the predicted label, and the probabilities for each target class.
from metaflow import FlowSpec, step, Flow, Parameter, current, card
import numpy as np
class SinglePredictionFlow(FlowSpec):
upstream_flow = Parameter('flow', default = 'TuningFlow')
image_location = Parameter('im', default = './mnist_random_img.npy')
@step
def start(self):
from tensorflow import keras
softmax = keras.layers.Softmax()
run = list(Flow(self.upstream_flow).runs('production'))[-1]
self.model = run.data.best_model
with open(self.image_location, 'rb') as f:
self.image = np.load(f)
self.logits = self.model.predict(x = np.array([self.image]))
self.probs = softmax(self.logits).numpy()
if np.isclose(1, np.sum(self.probs)):
self.pred = self.probs.argmax()
else:
self.fallback_model = "Random Guess"
self.pred = np.random.randint(low=0, high=9)
print("{}/{} probabilities not adding to 1".format(
self.__class__.__name__, current.run_id))
print("Returning random fall back prediction")
self.next(self.end)
@card
@step
def end(self):
import matplotlib.pyplot as plt
from metaflow.cards import Table, Markdown, Image
self.im_fig, self.im_ax = plt.subplots()
self.im_ax.imshow(self.image, cmap='gray')
im1 = Image.from_matplotlib(self.im_fig)
md = Markdown("# Prediction: {}".format(self.pred))
self.dist_fig, self.dist_ax = plt.subplots()
self.dist_ax.barh(y=np.arange(
self.probs[0].shape[0]), width=self.probs[0])
self.dist_ax.set_yticks(
np.arange(self.probs[0].shape[0]),
labels=np.arange(self.probs[0].shape[0])
)
self.dist_ax.set_ylabel('Probability', fontsize=18)
im2 = Image.from_matplotlib(self.dist_fig)
current.card.append(Table([[im1, md, im2]]))
if __name__ == '__main__':
SinglePredictionFlow()
2Choose a Test Data Sample
To test the SinglePredictionFlow
, you can save an image with NumPy's .npy
file extension like mnist-random-img.npy
.
Then, pass the filename to a SinglePredictionFlow
run and get a prediction from the latest TuningFlow
model tagged with production
.
from tensorflow import keras
import numpy as np
((x_train, y_train), (x_test, y_test)) = keras.datasets.mnist.load_data()
random_idx = np.random.randint(x_test.shape[0])
with open('./mnist_random_img.npy', 'wb') as f:
np.save(f, x_test[random_idx])
3Run the Prediction Flow
python prediction_flow.py run --im './mnist_random_img.npy'
4Monitor Your Model
Now you can look at the results of the prediction. You could use the client API as shown in the previous episode.
In this case, you appended a Metaflow card
to the end
step of SinglePredictionFlow
, so you can view the resulting visualization with this command:
python prediction_flow.py card view end
Conclusion
Congratulations, you have completed Metaflow's introductory tutorial on computer vision workflows! You have learned how to:
- Create a flow that tracks and enables a comparison between machine learning models.
- Visualize results of model training and prediction.
- Use branching to perform steps in parallel.
- Use tagging to evaluate and gate models for production.
- Retrieve your model from another flow for prediction.
To keep progressing in your Metaflow journey you can:
- Check out the open-source repository.
- Join our Slack community and learn with us in #ask-metaflow.