| # MNIST Examples for GGML | |
| These are simple examples of how to use GGML for inferencing. | |
| The first example uses convolutional neural network (CNN), the second one uses fully connected neural network. | |
| ## Building the examples | |
| ```bash | |
| git clone https://github.com/ggerganov/ggml | |
| cd ggml | |
| mkdir build && cd build | |
| cmake .. | |
| make -j4 mnist-cnn mnist | |
| ``` | |
| ## MNIST with CNN | |
| This implementation achieves ~99% accuracy on the MNIST test set. | |
| ### Training the model | |
| Use the `mnist-cnn.py` script to train the model and convert it to GGUF format: | |
| ``` | |
| $ python3 ../examples/mnist/mnist-cnn.py train mnist-cnn-model | |
| ... | |
| Keras model saved to 'mnist-cnn-model' | |
| ``` | |
| Convert the model to GGUF format: | |
| ``` | |
| $ python3 ../examples/mnist/mnist-cnn.py convert mnist-cnn-model | |
| ... | |
| Model converted and saved to 'mnist-cnn-model.gguf' | |
| ``` | |
| ### Running the example | |
| ```bash | |
| $ ./bin/mnist-cnn mnist-cnn-model.gguf ../examples/mnist/models/mnist/t10k-images.idx3-ubyte | |
| main: loaded model in 5.17 ms | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ * * * * * _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ * * * * * * * * _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ * * * * * _ _ _ * * _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ * * _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ * _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ * * _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ * * _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ * * * _ _ _ _ * * * * * _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ * * * * * * * * * _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ * * * * * * * * * * _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ * * * * * * _ _ * * * _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ * * * _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ * * _ _ _ _ _ _ _ _ _ * * _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ * * _ _ _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ * * _ _ _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ * * * _ _ _ _ _ _ * * * _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ * * * * * * * * * * _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ * * * * * * _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ggml_graph_dump_dot: dot -Tpng mnist-cnn.dot -o mnist-cnn.dot.png && open mnist-cnn.dot.png | |
| main: predicted digit is 8 | |
| ``` | |
| Computation graph: | |
|  | |
| ## MNIST with fully connected network | |
| A fully connected layer + relu, followed by a fully connected layer + softmax. | |
| ### Training the Model | |
| A Google Colab notebook for training a simple two-layer network to recognize digits is located here. You can | |
| use this to save a pytorch model to be converted to ggml format. | |
| [Colab](https://colab.research.google.com/drive/12n_8VNJnolBnX5dVS0HNWubnOjyEaFSb?usp=sharing) | |
| GGML "format" is whatever you choose for efficient loading. In our case, we just save the hyperparameters used | |
| plus the model weights and biases. Run convert-h5-to-ggml.py to convert your pytorch model. The output format is: | |
| - magic constant (int32) | |
| - repeated list of tensors | |
| - number of dimensions of tensor (int32) | |
| - tensor dimension (int32 repeated) | |
| - values of tensor (int32) | |
| Run ```convert-h5-to-ggml.py mnist_model.state_dict``` where `mnist_model.state_dict` is the saved pytorch model from the Google Colab. For | |
| quickstart, it is included in the mnist/models directory. | |
| ```bash | |
| mkdir -p models/mnist | |
| python3 ../examples/mnist/convert-h5-to-ggml.py ../examples/mnist/models/mnist/mnist_model.state_dict | |
| ``` | |
| ### Running the example | |
| ```bash | |
| ./bin/mnist ./models/mnist/ggml-model-f32.bin ../examples/mnist/models/mnist/t10k-images.idx3-ubyte | |
| ``` | |
| Computation graph: | |
|  | |
| ## Web demo | |
| The example can be compiled with Emscripten like this: | |
| ```bash | |
| cd examples/mnist | |
| emcc -I../../include -I../../include/ggml -I../../examples ../../src/ggml.c main.cpp -o web/mnist.js -s EXPORTED_FUNCTIONS='["_wasm_eval","_wasm_random_digit","_malloc","_free"]' -s EXPORTED_RUNTIME_METHODS='["ccall"]' -s ALLOW_MEMORY_GROWTH=1 --preload-file models/mnist | |
| ``` | |
| Online demo: https://mnist.ggerganov.com | |