# Optimize MLOps with Arm-hosted GitHub Runners

## In this learning path

- [Introduction](https://learn.arm.com/learning-paths/servers-and-cloud-computing/gh-runners/)
- [MLOps background](https://learn.arm.com/learning-paths/servers-and-cloud-computing/gh-runners/background/)
- [Understand neural network model training and testing](https://learn.arm.com/learning-paths/servers-and-cloud-computing/gh-runners/train-test/)
- [Automate training and testing with GitHub Actions](https://learn.arm.com/learning-paths/servers-and-cloud-computing/gh-runners/workflows/)
- [Compare the performance of PyTorch backends](https://learn.arm.com/learning-paths/servers-and-cloud-computing/gh-runners/compare-performance/)
- [Deploy the application as a container](https://learn.arm.com/learning-paths/servers-and-cloud-computing/gh-runners/deploy/)
- [End-to-end MLOps workflow](https://learn.arm.com/learning-paths/servers-and-cloud-computing/gh-runners/e2e-workflow/)
- [Next Steps](https://learn.arm.com/learning-paths/servers-and-cloud-computing/gh-runners/_next-steps/)

## About this Learning Path

| Skill level:        | Introductory            |
|---------------------|-------------------------|
| Reading time:       | 1 hr                    |
| Last updated:       | 14 Sep 2026             |

| Authors:            |                         |
|---------------------|-------------------------|
| Pareena Verma, Arm  | [GitHub](https://github.com/pareenaverma) [LinkedIn](https://linkedin.com/in/pareena-verma-7853607) |
| Annie Tallund, Arm  | [GitHub](https://github.com/annietllnd) [LinkedIn](https://linkedin.com/in/annietallund) |

| Arm IP:             | [Neoverse](https://support.arm.com/?tab=compute-ip&Product%20Type=Infrastructure%20Processors) |
| Tags:               | CI-CD, Linux, Python, PyTorch, ACL, GitHub |

### Who is this for?
This is an introductory topic for software developers interested in automation for Machine Learning (ML) tasks.

### What will you learn?
Upon completion of this Learning Path, you will be able to:

- Set up an Arm-hosted GitHub runner.
- Train and test a PyTorch ML model with the German Traffic Sign Recognition Benchmark (GTSRB) dataset.
- Compare the performance of two trained PyTorch ML models. One model is compiled with Open Basic Linear Algebra Subprograms Library (OpenBLAS) and oneAPI Deep Neural Network Library (oneDNN). The other model is compiled with Arm Compute Library (ACL).
- Containerize a ML model and push the container to DockerHub.
- Automate steps in an ML workflow using GitHub Actions.

### Prerequisites
Before starting, you will need the following:

- A GitHub account with access to Arm-hosted GitHub runners
- A Docker Hub account for storing container images
- Familiarity with the concepts of ML and continuous integration and deployment (CI/CD)

### Summary
You’ll automate an MLOps workflow on Arm-hosted GitHub runners with GitHub Actions. First, you’ll train and test a PyTorch model, compare OpenBLAS and oneDNN with ACL, and capture workflow artifacts. Then, you’ll containerize the application and push it to DockerHub, deploy the application, and access the model through API calls. You can compare the resulting workflows using repeatable runs.

### Frequently asked questions
<details>
<summary>Where should I fork the repository to use Arm-hosted GitHub runners?</summary>
Fork the example into a GitHub Organization or Team that has access to Arm-hosted GitHub runners. If a repository with the same name already exists, change the repository name when you fork.
</details>

<details>
<summary>How do I know that the training workflow finished successfully and produced a model?</summary>
Check the **Actions** tab for a successful run of `github/workflows/train-model.yml` and verify that a model artifact was created. The workflow trains inside a PyTorch 2.3.0 Docker image compiled with OpenBLAS and saves the trained model for later steps.
</details>

<details>
<summary>How do I switch the PyTorch backend for inference testing?</summary>
Update the testing workflow to use the backend with oneDNN and ACL instead of the OpenBLAS-based image, then trigger the run.
</details>

<details>
<summary>Where do I find the inference performance results to compare runs?</summary>
Review the workflow run logs and any artifacts produced by the testing workflow. The artifacts and logs report the model’s inference time. Compare outputs from the OpenBLAS and oneDNN+ACL runs to see differences.
</details>

<details>
<summary>Which Docker Hub secrets does the deployment workflow require?</summary>
Add `DOCKER_USERNAME` with your Docker Hub username and `DOCKER_PASSWORD` with your Docker Hub Personal Access Token as repository secrets under **Settings** > **Secrets and variables** > **Actions**.
</details>
