From 8fef214a0e23b156b2230dd57e13c250437fe193 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 12 Sep 2021 17:17:16 +0100 Subject: [PATCH 1/4] Updated to 0.8.0 Signed-off-by: Alejandro Saucedo --- CMakeLists.txt | 2 +- VERSION | 2 +- docs/conf.py | 2 +- setup.py | 2 +- vcpkg.json.opt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f7022b3c0..0e535ed22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 cmake_minimum_required(VERSION 3.4.1) -project(kompute VERSION 0.7.0) +project(kompute VERSION 0.8.0) set(CMAKE_CXX_STANDARD 14) diff --git a/VERSION b/VERSION index faef31a43..a3df0a695 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.7.0 +0.8.0 diff --git a/docs/conf.py b/docs/conf.py index 029ae00cb..2cc81b1ed 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -27,7 +27,7 @@ html_title = "Kompute Documentation (Python & C++)" author = 'Alejandro Saucedo' # The full version, including alpha/beta/rc tags -release = '0.7.0' +release = '0.8.0' # -- General configuration --------------------------------------------------- diff --git a/setup.py b/setup.py index 2e23e5069..c92ef1852 100644 --- a/setup.py +++ b/setup.py @@ -74,7 +74,7 @@ class CMakeBuild(build_ext): setup( name='kp', - version='0.7.0', + version='0.8.0', author='Alejandro Saucedo', description='Kompute: Blazing fast, mobile-enabled, asynchronous, and optimized for advanced GPU processing usecases.', long_description=long_description, diff --git a/vcpkg.json.opt b/vcpkg.json.opt index e2db75236..c2109e558 100644 --- a/vcpkg.json.opt +++ b/vcpkg.json.opt @@ -1,6 +1,6 @@ { "name": "example", - "version-string": "0.7.0", + "version-string": "0.8.0", "dependencies": [ "fmt", "spdlog", From 99df5a2be99dee298322c4b85aefe2507845a788 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 12 Sep 2021 17:28:21 +0100 Subject: [PATCH 2/4] Added changelog Signed-off-by: Alejandro Saucedo --- CHANGELOG.md | 71 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64b67cf59..3566bd587 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,62 @@ # Changelog -## [v0.7.0](https://github.com/KomputeProject/kompute/tree/v0.7.0) +## [v0.8.0](https://github.com/KomputeProject/kompute/tree/v0.8.0) + +[Full Changelog](https://github.com/KomputeProject/kompute/compare/v0.7.0...v0.8.0) + +**Closed issues:** + +- Extend utils shader helpers in test for windows [\#240](https://github.com/KomputeProject/kompute/issues/240) +- Python segfaults after import kp [\#230](https://github.com/KomputeProject/kompute/issues/230) +- Simple and extended python examples do not work \(v 0.7.0\) [\#228](https://github.com/KomputeProject/kompute/issues/228) +- Python macOS issue \(ImportError: dlopen\(...\): no suitable image found. Did find: ...: mach-o, but wrong architecture\) [\#223](https://github.com/KomputeProject/kompute/issues/223) +- Python macOS issue \(Symbol not found: \_\_PyThreadState\_Current ... Expected in: flat namespace\) [\#221](https://github.com/KomputeProject/kompute/issues/221) +- Finalise Migration of Kompute into Linux Foundation [\#216](https://github.com/KomputeProject/kompute/issues/216) +- CMake Error: Imported target "kompute::kompute" includes non-existent path "/usr/local/single\_include" [\#212](https://github.com/KomputeProject/kompute/issues/212) +- Incompatibality inroduced with \#168 on Vulkan 1.1.x [\#209](https://github.com/KomputeProject/kompute/issues/209) +- external libraries [\#201](https://github.com/KomputeProject/kompute/issues/201) +- Starting slack group or discord for alternative / faster version of asking questions [\#198](https://github.com/KomputeProject/kompute/issues/198) +- Test SingleSequenceRecord is not thread safe and fails in AMD card [\#196](https://github.com/KomputeProject/kompute/issues/196) +- Update Kompute headers to reference the glslang headers for install vs build interfaces [\#193](https://github.com/KomputeProject/kompute/issues/193) +- Integrate with GLSLang find\_package file when issue is resolved in the glslang repo [\#191](https://github.com/KomputeProject/kompute/issues/191) +- Release 0.7.0 [\#187](https://github.com/KomputeProject/kompute/issues/187) +- Get number of available devices [\#185](https://github.com/KomputeProject/kompute/issues/185) +- Deep Learning Convolutional Neural Network \(CNN\) example implementation [\#162](https://github.com/KomputeProject/kompute/issues/162) +- Create example compiling and running in raspberry pi with Mesa Vulkan drivers [\#131](https://github.com/KomputeProject/kompute/issues/131) +- Add support for VK\_EXT\_debug\_utils labels [\#110](https://github.com/KomputeProject/kompute/issues/110) + +**Merged pull requests:** + +- Adding support for different types for spec and push consts [\#242](https://github.com/KomputeProject/kompute/pull/242) ([axsaucedo](https://github.com/axsaucedo)) +- Extend shader helper functions in tests to support windows [\#241](https://github.com/KomputeProject/kompute/pull/241) ([axsaucedo](https://github.com/axsaucedo)) +- Increase test cov across codebase [\#239](https://github.com/KomputeProject/kompute/pull/239) ([axsaucedo](https://github.com/axsaucedo)) +- Updated collab link for C++ notebook [\#237](https://github.com/KomputeProject/kompute/pull/237) ([axsaucedo](https://github.com/axsaucedo)) +- Updating repo licenses and links [\#236](https://github.com/KomputeProject/kompute/pull/236) ([axsaucedo](https://github.com/axsaucedo)) +- Removing GLSLang as core dependency [\#235](https://github.com/KomputeProject/kompute/pull/235) ([axsaucedo](https://github.com/axsaucedo)) +- Naive matrice multiplication example [\#233](https://github.com/KomputeProject/kompute/pull/233) ([Corentin-pro](https://github.com/Corentin-pro)) +- Fixed typo in CMakeLists.txt \(ANDOID =\> ANDROID\) [\#232](https://github.com/KomputeProject/kompute/pull/232) ([Corentin-pro](https://github.com/Corentin-pro)) +- Set kp\_debug, kp\_info, kp\_warning and kp\_error to py::none\(\) when the program terminates. [\#231](https://github.com/KomputeProject/kompute/pull/231) ([thinking-tower](https://github.com/thinking-tower)) +- VGG7 Python example [\#227](https://github.com/KomputeProject/kompute/pull/227) ([20kdc](https://github.com/20kdc)) +- Add documentation for CMake flags [\#224](https://github.com/KomputeProject/kompute/pull/224) ([thinking-tower](https://github.com/thinking-tower)) +- Set PYTHON\_INCLUDE\_DIR and PYTHON\_LIBRARY during installation [\#222](https://github.com/KomputeProject/kompute/pull/222) ([thinking-tower](https://github.com/thinking-tower)) +- Removing xxd.exe binary and add instructions to build [\#220](https://github.com/KomputeProject/kompute/pull/220) ([axsaucedo](https://github.com/axsaucedo)) +- \[PYTHON\] Ensure numpy array increments refcount of tensor to keep valid [\#219](https://github.com/KomputeProject/kompute/pull/219) ([axsaucedo](https://github.com/axsaucedo)) +- Added destroy for manager [\#218](https://github.com/KomputeProject/kompute/pull/218) ([axsaucedo](https://github.com/axsaucedo)) +- Revert "Fixed the issue that caused CMake to look for non-existent path after being installed" [\#217](https://github.com/KomputeProject/kompute/pull/217) ([axsaucedo](https://github.com/axsaucedo)) +- Fixed the issue that caused CMake to look for non-existent path after being installed [\#213](https://github.com/KomputeProject/kompute/pull/213) ([unexploredtest](https://github.com/unexploredtest)) +- omitted .data\(\) because it is incompatible with vulkan 1.1.x [\#211](https://github.com/KomputeProject/kompute/pull/211) ([unexploredtest](https://github.com/unexploredtest)) +- vkEnumeratePhysicalDevices\(\*\(this-\>mInstance\) ... doesn't work on Linux i386 [\#208](https://github.com/KomputeProject/kompute/pull/208) ([unexploredtest](https://github.com/unexploredtest)) +- Raises an error when having no/exceeding vulkan device's limit [\#207](https://github.com/KomputeProject/kompute/pull/207) ([unexploredtest](https://github.com/unexploredtest)) +- Updated README and fixed a syntax error on C++'s example [\#206](https://github.com/KomputeProject/kompute/pull/206) ([unexploredtest](https://github.com/unexploredtest)) +- removed the extra comma after KOMPUTE\_OPT\_REPO\_SUBMODULE\_BUILD [\#205](https://github.com/KomputeProject/kompute/pull/205) ([unexploredtest](https://github.com/unexploredtest)) +- Extending list\_devices test for multiple devices [\#204](https://github.com/KomputeProject/kompute/pull/204) ([axsaucedo](https://github.com/axsaucedo)) +- Fix \#include \ [\#200](https://github.com/KomputeProject/kompute/pull/200) ([unexploredtest](https://github.com/unexploredtest)) +- Added memory barrier on test [\#199](https://github.com/KomputeProject/kompute/pull/199) ([axsaucedo](https://github.com/axsaucedo)) +- Add function to list physical devices [\#195](https://github.com/KomputeProject/kompute/pull/195) ([axsaucedo](https://github.com/axsaucedo)) +- v0.7.0 release [\#189](https://github.com/KomputeProject/kompute/pull/189) ([axsaucedo](https://github.com/axsaucedo)) +- Add instructions for running on Pi4 [\#180](https://github.com/KomputeProject/kompute/pull/180) ([hpgmiskin](https://github.com/hpgmiskin)) + +## [v0.7.0](https://github.com/KomputeProject/kompute/tree/v0.7.0) (2021-03-14) [Full Changelog](https://github.com/KomputeProject/kompute/compare/v0.6.0...v0.7.0) @@ -33,8 +89,9 @@ **Closed issues:** +- Add ability to specify whether to build shared or static dependencies as well as option for Kompute lib [\#190](https://github.com/KomputeProject/kompute/issues/190) - Update memory barriers to align with tensor staging/primary memory revamp [\#181](https://github.com/KomputeProject/kompute/issues/181) -- Move shader defaultResource inside kp_test_utils::Shader class [\#175](https://github.com/KomputeProject/kompute/issues/175) +- Move shader defaultResource inside kp::Shader class [\#175](https://github.com/KomputeProject/kompute/issues/175) - Reach at least 90% code coverage on tests [\#170](https://github.com/KomputeProject/kompute/issues/170) - Add functionality to re-record sequence as now it's possible to update the underlying algorithm [\#169](https://github.com/KomputeProject/kompute/issues/169) - Use numpy arrays as default return value [\#166](https://github.com/KomputeProject/kompute/issues/166) @@ -60,9 +117,9 @@ - Too many warnings [\#183](https://github.com/KomputeProject/kompute/pull/183) ([alexander-g](https://github.com/alexander-g)) - Add support for bool, double, int32, uint32 and float32 on Tensors via TensorT [\#177](https://github.com/KomputeProject/kompute/pull/177) ([axsaucedo](https://github.com/axsaucedo)) - Support for Timestamping [\#176](https://github.com/KomputeProject/kompute/pull/176) ([alexander-g](https://github.com/alexander-g)) -- Test for ShaderResources [\#165](https://github.com/KomputeProject/kompute/pull/165) ([aliPMPAINT](https://github.com/aliPMPAINT)) +- Test for ShaderResources [\#165](https://github.com/KomputeProject/kompute/pull/165) ([unexploredtest](https://github.com/unexploredtest)) - Amend memory hierarchy to enable for push constants and functional interface for more flexible operations [\#164](https://github.com/KomputeProject/kompute/pull/164) ([axsaucedo](https://github.com/axsaucedo)) -- made changes for include paths for complete installation [\#163](https://github.com/KomputeProject/kompute/pull/163) ([aliPMPAINT](https://github.com/aliPMPAINT)) +- made changes for include paths for complete installation [\#163](https://github.com/KomputeProject/kompute/pull/163) ([unexploredtest](https://github.com/unexploredtest)) - Added dark mode on docs [\#157](https://github.com/KomputeProject/kompute/pull/157) ([axsaucedo](https://github.com/axsaucedo)) - Glslang implementation for online shader compilation [\#154](https://github.com/KomputeProject/kompute/pull/154) ([axsaucedo](https://github.com/axsaucedo)) - Adding test code coverage using gcov and lcov [\#149](https://github.com/KomputeProject/kompute/pull/149) ([axsaucedo](https://github.com/axsaucedo)) @@ -107,8 +164,8 @@ - 122 remove spdlog references in python [\#123](https://github.com/KomputeProject/kompute/pull/123) ([axsaucedo](https://github.com/axsaucedo)) - Native logging for Python [\#118](https://github.com/KomputeProject/kompute/pull/118) ([alexander-g](https://github.com/alexander-g)) -- Fixes for the c++ Simple and Extended examples in readme [\#108](https://github.com/KomputeProject/kompute/pull/108) ([aliPMPAINT](https://github.com/aliPMPAINT)) -- Fix building shaders on native linux [\#102](https://github.com/KomputeProject/kompute/pull/102) ([aliPMPAINT](https://github.com/aliPMPAINT)) +- Fixes for the c++ Simple and Extended examples in readme [\#108](https://github.com/KomputeProject/kompute/pull/108) ([unexploredtest](https://github.com/unexploredtest)) +- Fix building shaders on native linux [\#102](https://github.com/KomputeProject/kompute/pull/102) ([unexploredtest](https://github.com/unexploredtest)) ## [v0.5.1](https://github.com/KomputeProject/kompute/tree/v0.5.1) (2020-11-12) @@ -119,6 +176,7 @@ - Remove the template params from OpAlgoBase for dispatch layout [\#57](https://github.com/KomputeProject/kompute/issues/57) - Enable layout to be configured dynamically within shaders [\#26](https://github.com/KomputeProject/kompute/issues/26) - replaced "static unsigned const" to "static const unsigned" to avoid SWIG parsing error. [\#95](https://github.com/KomputeProject/kompute/pull/95) ([0x0f0f0f](https://github.com/0x0f0f0f)) +- codespell spelling fixes [\#80](https://github.com/KomputeProject/kompute/pull/80) ([pH5](https://github.com/pH5)) **Closed issues:** @@ -154,7 +212,6 @@ - Upgrade build to support VulkanHPP 1.2.154 \< 1.2.158 [\#82](https://github.com/KomputeProject/kompute/issues/82) - Add Android example for Kompute [\#23](https://github.com/KomputeProject/kompute/issues/23) - Fix compatibility for Vulkan HPP 1.2.155 and above [\#83](https://github.com/KomputeProject/kompute/pull/83) ([axsaucedo](https://github.com/axsaucedo)) -- codespell spelling fixes [\#80](https://github.com/KomputeProject/kompute/pull/80) ([pH5](https://github.com/pH5)) **Closed issues:** From 1b0159e02c8e927b1f3681708945176cf4466fec Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 12 Sep 2021 19:12:29 +0100 Subject: [PATCH 3/4] Updated documentation to add relevant pages for releasE Signed-off-by: Alejandro Saucedo --- docs/index.rst | 14 +++++++-- docs/overview/convolutional-net.rst | 3 ++ docs/overview/matmul-benchmark.rst | 12 ++++++++ docs/overview/raspberry-pi.rst | 3 ++ examples/neural_network_vgg7/.gitignore | 1 - examples/neural_network_vgg7/README.md | 37 ++++++++++++++++++++++-- examples/neural_network_vgg7/out.png | Bin 0 -> 49105 bytes 7 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 docs/overview/convolutional-net.rst create mode 100644 docs/overview/matmul-benchmark.rst create mode 100644 docs/overview/raspberry-pi.rst create mode 100644 examples/neural_network_vgg7/out.png diff --git a/docs/index.rst b/docs/index.rst index f3358a00f..b7c80404c 100755 --- a/docs/index.rst +++ b/docs/index.rst @@ -33,9 +33,19 @@ Documentation Index (as per sidebar) :caption: Python Documentation: Python Package Overview - Python Examples Python Class Documentation & Reference +.. toctree:: + :titlesonly: + :caption: Examples: + + Python Examples + C++ Examples + Android Mobile App Integration + Game Engine Godot Integration + Example Benchmark with Matrix Multiplication + Convolutional Neural Network (CNN) Simple Upscale + .. toctree:: :titlesonly: :caption: Advanced Concepts & Deep Dives: @@ -43,7 +53,5 @@ Documentation Index (as per sidebar) CI, Docker Images Docs & Tests Variable Types for Tensors, and Push/Spec Constants Asynchronous & Parallel Operations - Mobile App Integration (Android) - Game Engine Integration (Godot Engine) Code Index diff --git a/docs/overview/convolutional-net.rst b/docs/overview/convolutional-net.rst new file mode 100644 index 000000000..aed1673d7 --- /dev/null +++ b/docs/overview/convolutional-net.rst @@ -0,0 +1,3 @@ + +.. mdinclude:: ../../examples/neural_network_vgg7/README.md + diff --git a/docs/overview/matmul-benchmark.rst b/docs/overview/matmul-benchmark.rst new file mode 100644 index 000000000..8fb06eac8 --- /dev/null +++ b/docs/overview/matmul-benchmark.rst @@ -0,0 +1,12 @@ + +.. mdinclude:: ../../examples/python_naive_matmul/README.md + + +Implementation Overview +================ + +The benchmark can be found in the `benchmark.py` file in the repo, which is outlined below. This file runs a naive implementation of the three matrix multiplication implementations to evaluate the performance of each. + +.. literalinclude:: ../../examples/python_naive_matmuln/benchmark.py + :language: python + diff --git a/docs/overview/raspberry-pi.rst b/docs/overview/raspberry-pi.rst new file mode 100644 index 000000000..cd28bccbb --- /dev/null +++ b/docs/overview/raspberry-pi.rst @@ -0,0 +1,3 @@ + +.. mdinclude:: ../../examples/pi4_mesa_build/README.md + diff --git a/examples/neural_network_vgg7/.gitignore b/examples/neural_network_vgg7/.gitignore index 71319ea08..999940f78 100644 --- a/examples/neural_network_vgg7/.gitignore +++ b/examples/neural_network_vgg7/.gitignore @@ -1,3 +1,2 @@ model-kipper model.json -out.png diff --git a/examples/neural_network_vgg7/README.md b/examples/neural_network_vgg7/README.md index 3e6b06df7..49cd6d979 100644 --- a/examples/neural_network_vgg7/README.md +++ b/examples/neural_network_vgg7/README.md @@ -1,6 +1,17 @@ -# Waifu2x VGG7 implementation +# Convolutional Neural Network (CNN) VGG7 implementation -This demonstrates performing image upscaling using Python and kompute. +This example provides an implementation of a convolutional neural network (CNN) that enables for image resolution upscaling, which means that images can improve their quality through purely the machine learning implementation. + +This example demonstrates performing image upscaling using Kompute on the test image below. + +In this example we will be doing the following: + +* Import pre-trained model +* Create Kompute code that loads model weights +* Create Kompute shader that performs inference on image +* Run model against image to perform upscale + +## Import pre-trained model To import the no-noise-compensation VGG7 model (into `model-kipper`): @@ -11,7 +22,27 @@ python3 import_vgg7.py model.json Other models from the vgg\_7 set (such as `https://raw.githubusercontent.com/nagadomi/waifu2x/master/models/vgg_7/photo/noise0_model.json`) can be subsituted as desired. -To execute that model (no tiling is performed, so be careful about image sizes): +## Create code that loads model weights + +We implement the kompute logic under run_vgg7 that loads the model weights and coordinates the execution of the inference. + +## Create Kompute shader that performs inference on image + +Similarly, we created a compute shader that performs an inference iteration on an image provided to perfrom upscaling. + +## run model against image to perfrom upscale + +We now execute model against an image created by us to show how upscaling works. The image used will be the one below: + +![](w2wbinit.png) + +To execute that model no tiling is performed, so be careful about image sizes. + +We can now run the command below to perform inference against the image blow. `python3 run_vgg7.py w2wbinit.png out.png` +This would successfully upscale the resolution using the machine learning model, and the result is below: + +![](out.png) + diff --git a/examples/neural_network_vgg7/out.png b/examples/neural_network_vgg7/out.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb718eef13ea0d51ad1e2b2f75daf4db4a09d64 GIT binary patch literal 49105 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 Date: Sun, 12 Sep 2021 19:34:50 +0100 Subject: [PATCH 4/4] Added to changelog Signed-off-by: Alejandro Saucedo --- docs/overview/matmul-benchmark.rst | 6 ++++-- examples/neural_network_vgg7/README.md | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/overview/matmul-benchmark.rst b/docs/overview/matmul-benchmark.rst index 8fb06eac8..5dfe25711 100644 --- a/docs/overview/matmul-benchmark.rst +++ b/docs/overview/matmul-benchmark.rst @@ -3,10 +3,12 @@ Implementation Overview -================ +--------- The benchmark can be found in the `benchmark.py` file in the repo, which is outlined below. This file runs a naive implementation of the three matrix multiplication implementations to evaluate the performance of each. -.. literalinclude:: ../../examples/python_naive_matmuln/benchmark.py + +.. literalinclude:: ../../examples/python_naive_matmul/benchmark.py :language: python + diff --git a/examples/neural_network_vgg7/README.md b/examples/neural_network_vgg7/README.md index 49cd6d979..cbf9635c2 100644 --- a/examples/neural_network_vgg7/README.md +++ b/examples/neural_network_vgg7/README.md @@ -30,11 +30,11 @@ We implement the kompute logic under run_vgg7 that loads the model weights and c Similarly, we created a compute shader that performs an inference iteration on an image provided to perfrom upscaling. -## run model against image to perfrom upscale +## Run model against image to perfrom upscale We now execute model against an image created by us to show how upscaling works. The image used will be the one below: -![](w2wbinit.png) +![](https://raw.githubusercontent.com/KomputeProject/kompute/master/examples/neural_network_vgg7/w2wbinit.png) To execute that model no tiling is performed, so be careful about image sizes. @@ -44,5 +44,6 @@ We can now run the command below to perform inference against the image blow. This would successfully upscale the resolution using the machine learning model, and the result is below: -![](out.png) +![](https://raw.githubusercontent.com/KomputeProject/kompute/master/examples/neural_network_vgg7/out.png) +