blob: 4cd01425f06115f2b8fc84d2bb7732eef9bd4292 [file] [log] [blame]
.. Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
Building SINGA on Windows
=========================
The process of building SINGA from source on Microsoft Windows has four parts: install dependencies, build SINGA source, (optionally) install the python module and (optionally) run the unit tests.
1. Install Dependencies
-----------------------
You may create a folder for building the dependencies.
The dependencies are:
* Compiler and IDE
* Visual Studio. The community edition is free and can be used to build SINGA. https://www.visualstudio.com/
* CMake
* Can be downloaded from http://cmake.org/
* Make sure the path to cmake executable is in the system path, or use full path when calling cmake.
* SWIG
* Can be downloaded from http://swig.org/
* Make sure the path to swig executable is in the system path, or use full path when calling swig. Use a recent version such as 3.0.12.
* Protocol Buffers
* Download a suitable version such as 2.6.1: https://github.com/google/protobuf/releases/tag/v2.6.1 .
* Download both protobuf-2.6.1.zip and protoc-2.6.1-win32.zip .
* Extract both of them in dependencies folder. Add the path to protoc executable to the system path, or use full path when calling it.
* Open the Visual Studio solution which can be found in vsproject folder.
* Change the build settings to Release and x64.
* build libprotobuf project.
* Openblas
* Download a suitable source version such as 0.2.20 from http://www.openblas.net
* Extract the source in the dependencies folder.
* If you don't have Perl installed, download a perl environment such as Strawberry Perl (http://strawberryperl.com/)
* Build the Visual Studio solution by running this command in the source folder:
.. code-block:: bash
cmake -G "Visual Studio 15 2017 Win64"
* Open the Visual Studio solution and change the build settings to Release and x64.
* Build libopenblas project
* Google glog
* Download a suitable version such as 0.3.5 from https://github.com/google/glog/releases
* Extract the source in the dependencies folder.
* Open the Visual Studio solution.
* Change the build settings to Release and x64.
* Build libglog project
2. Build SINGA source
---------------------
* Download SINGA source code
* Compile the protobuf files:
* Goto src/proto folder
.. code-block:: bash
mkdir python_out
protoc.exe *.proto --python_out python_out
* Generate swig interfaces for C++ and Python:
Goto src/api
.. code-block:: bash
swig -python -c++ singa.i
* generate Visual Studio solution for SINGA:
Goto SINGA source code root folder
.. code-block:: bash
mkdir build
cd build
* Call cmake and add the paths in your system similar to the following example:
.. code-block:: bash
cmake -G "Visual Studio 15 2017 Win64" ^
-DGLOG_INCLUDE_DIR="D:/WinSinga/dependencies/glog-0.3.5/src/windows" ^
-DGLOG_LIBRARIES="D:/WinSinga/dependencies/glog-0.3.5/x64/Release" ^
-DCBLAS_INCLUDE_DIR="D:/WinSinga/dependencies/openblas-0.2.20/lapack-netlib/CBLAS/include" ^
-DCBLAS_LIBRARIES="D:/WinSinga/dependencies/openblas-0.2.20/lib/RELEASE" ^
-DProtobuf_INCLUDE_DIR="D:/WinSinga/dependencies/protobuf-2.6.1/src" ^
-DProtobuf_LIBRARIES="D:/WinSinga/dependencies/protobuf-2.6.1/vsprojects/x64/Release" ^
-DProtobuf_PROTOC_EXECUTABLE="D:/WinSinga/dependencies/protoc-2.6.1-win32/protoc.exe" ^
..
* Open the generated solution in Visual Studio
* Change the build settings to Release and x64
* Add the singa_wrap.cxx file from src/api to the singa_objects project
* In the singa_objects project, open Additional Include Directories.
* Add Python include path
* Add numpy include path
* Add protobuf include path
* In the preprocessor definitions of the singa_objects project, add USE_GLOG
* Build singa_objects project
* In singa project:
* add singa_wrap.obj to Object Libraries
* change target name to _singa_wrap
* change target extension to .pyd
* change configuration type to Dynamic Library (.dll)
* goto Additional Library Directories and add the path to python, openblas, protobuf and glog libraries
* goto Additional Dependencies and add libopenblas.lib, libglog.lib and libprotobuf.lib
* build singa project
3. Install Python module
------------------------
* Change _singa_wrap.so to _singa_wrap.pyd in build/python/setup.py
* Copy the files in src/proto/python_out to build/python/singa/proto
* Optionally create and activate a virtual environment:
.. code-block:: bash
mkdir SingaEnv
virtualenv SingaEnv
SingaEnv\Scripts\activate
* goto build/python folder and run:
.. code-block:: bash
python setup.py install
* Make _singa_wrap.pyd, libglog.dll and libopenblas.dll available by adding them to the path or by copying them to singa package folder in the python site-packages
* Verify that SINGA is installed by running:
.. code-block:: bash
python -c "from singa import tensor"
A video tutorial for the build process can be found here:
.. |video| image:: https://img.youtube.com/vi/cteER7WeiGk/0.jpg
:scale: 100%
:align: middle
:target: https://www.youtube.com/watch?v=cteER7WeiGk
+---------+
| |video| |
+---------+
4. Run Unit Tests
-----------------
* In the test folder, generate the Visual Studio solution:
.. code-block:: bash
cmake -G "Visual Studio 15 2017 Win64"
* Open the generated solution in Visual Studio.
* Change the build settings to Release and x64.
* Build glog project.
* In test_singa project:
* Add USE_GLOG to the Preprocessor Definitions.
* In Additional Include Directories, add path of GLOG_INCLUDE_DIR, CBLAS_INCLUDE_DIR and Protobuf_INCLUDE_DIR which were used in step 2 above. Add also build and build/include folders.
* Goto Additional Library Directories and add the path to openblas, protobuf and glog libraries. Add also build/src/singa_objects.dir/Release.
* Goto Additional Dependencies and add libopenblas.lib, libglog.lib and libprotobuf.lib. Fix the names of the two libraries: gtest.lib and singa_objects.lib.
* Build test_singa project.
* Make libglog.dll and libopenblas.dll available by adding them to the path or by copying them to test/release folder
* The unit tests can be executed
* From the command line:
.. code-block:: bash
test_singa.exe
* From Visual Studio:
* right click on the test_singa project and choose 'Set as StartUp Project'.
* from the Debug menu, choose 'Start Without Debugging'
A video tutorial for running the unit tests can be found here:
.. |video| image:: https://img.youtube.com/vi/393gPtzMN1k/0.jpg
:scale: 100%
:align: middle
:target: https://www.youtube.com/watch?v=393gPtzMN1k
+---------+
| |video| |
+---------+
5. Build GPU support with CUDA
------------------------------
In this section, we will extend the previous steps to enable GPU.
5.1 Install Dependencies
------------------------
In addition to the dependencies in section 1 above, we will need the following:
* CUDA
Download a suitable version such as 9.1 from https://developer.nvidia.com/cuda-downloads . Make sure to install the Visual Studio integration module.
* cuDNN
Download a suitable version such as 7.1 from https://developer.nvidia.com/cudnn
* cnmem:
* Download the latest version from https://github.com/NVIDIA/cnmem
* Build the Visual Studio solution:
.. code-block:: bash
cmake -G "Visual Studio 15 2017 Win64"
* Open the generated solution in Visual Studio.
* Change the build settings to Release and x64.
* Build the cnmem project.
5.2 Build SINGA source
----------------------
* Call cmake and add the paths in your system similar to the following example:
.. code-block:: bash
cmake -G "Visual Studio 15 2017 Win64" ^
-DGLOG_INCLUDE_DIR="D:/WinSinga/dependencies/glog-0.3.5/src/windows" ^
-DGLOG_LIBRARIES="D:/WinSinga/dependencies/glog-0.3.5/x64/Release" ^
-DCBLAS_INCLUDE_DIR="D:/WinSinga/dependencies/openblas-0.2.20/lapack-netlib/CBLAS/include" ^
-DCBLAS_LIBRARIES="D:/WinSinga/dependencies/openblas-0.2.20/lib/RELEASE" ^
-DProtobuf_INCLUDE_DIR="D:/WinSinga/dependencies/protobuf-2.6.1/src" ^
-DProtobuf_LIBRARIES="D:\WinSinga/dependencies/protobuf-2.6.1/vsprojects/x64/Release" ^
-DProtobuf_PROTOC_EXECUTABLE="D:/WinSinga/dependencies/protoc-2.6.1-win32/protoc.exe" ^
-DCUDNN_INCLUDE_DIR=D:\WinSinga\dependencies\cudnn-9.1-windows10-x64-v7.1\cuda\include ^
-DCUDNN_LIBRARIES=D:\WinSinga\dependencies\cudnn-9.1-windows10-x64-v7.1\cuda\lib\x64 ^
-DSWIG_DIR=D:\WinSinga\dependencies\swigwin-3.0.12 ^
-DSWIG_EXECUTABLE=D:\WinSinga\dependencies\swigwin-3.0.12\swig.exe ^
-DUSE_CUDA=YES ^
-DCUDNN_VERSION=7 ^
..
* Generate swig interfaces for C++ and Python:
Goto src/api
.. code-block:: bash
swig -python -c++ singa.i
* Open the generated solution in Visual Studio
* Change the build settings to Release and x64
5.2.1 Building singa_objects
----------------------------
* Add the singa_wrap.cxx file from src/api to the singa_objects project
* In the singa_objects project, open Additional Include Directories.
* Add Python include path
* Add numpy include path
* Add protobuf include path
* Add include path for CUDA, cuDNN and cnmem
* In the preprocessor definitions of the singa_objects project, add USE_GLOG, USE_CUDA and USE_CUDNN. Remove DISABLE_WARNINGS.
* Build singa_objects project
5.2.2 Building singa-kernel
---------------------------
* Create a new Visual Studio project of type "CUDA 9.1 Runtime". Give it a name such as singa-kernel.
* The project comes with an initial file called kernel.cu. Remove this file from the project.
* Add this file: src/core/tensor/math_kernel.cu
* In the project settings:
* Set Platform Toolset to "Visual Studio 2015 (v140)"
* Set Configuration Type to " Static Library (.lib)"
* In the Include Directories, add build/include.
* Build singa-kernel project
5.2.3 Building singa
--------------------
* In singa project:
* add singa_wrap.obj to Object Libraries
* change target name to _singa_wrap
* change target extension to .pyd
* change configuration type to Dynamic Library (.dll)
* goto Additional Library Directories and add the path to python, openblas, protobuf and glog libraries
* Add also the library path to singa-kernel, cnmem, cuda and cudnn.
* goto Additional Dependencies and add libopenblas.lib, libglog.lib and libprotobuf.lib.
* Add also: singa-kernel.lib, cnmem.lib, cudnn.lib, cuda.lib , cublas.lib, curand.lib and cudart.lib.
* build singa project
5.3. Install Python module
--------------------------
* Change _singa_wrap.so to _singa_wrap.pyd in build/python/setup.py
* Copy the files in src/proto/python_out to build/python/singa/proto
* Optionally create and activate a virtual environment:
.. code-block:: bash
mkdir SingaEnv
virtualenv SingaEnv
SingaEnv\Scripts\activate
* goto build/python folder and run:
.. code-block:: bash
python setup.py install
* Make _singa_wrap.pyd, libglog.dll, libopenblas.dll, cnmem.dll, CUDA Runtime (e.g. cudart64_91.dll) and cuDNN (e.g. cudnn64_7.dll) available by adding them to the path or by copying them to singa package folder in the python site-packages
* Verify that SINGA is installed by running:
.. code-block:: bash
python -c "from singa import device; dev = device.create_cuda_gpu()"
A video tutorial for this part can be found here:
.. |video| image:: https://img.youtube.com/vi/YasKVjRtuDs/0.jpg
:scale: 100%
:align: middle
:target: https://www.youtube.com/watch?v=YasKVjRtuDs
+---------+
| |video| |
+---------+
5.4. Run Unit Tests
-------------------
* In the test folder, generate the Visual Studio solution:
.. code-block:: bash
cmake -G "Visual Studio 15 2017 Win64"
* Open the generated solution in Visual Studio, or add the project to the singa solution that was created in step 5.2
* Change the build settings to Release and x64.
* Build glog project.
* In test_singa project:
* Add USE_GLOG; USE_CUDA; USE_CUDNN to the Preprocessor Definitions.
* In Additional Include Directories, add path of GLOG_INCLUDE_DIR, CBLAS_INCLUDE_DIR and Protobuf_INCLUDE_DIR which were used in step 5.2 above. Add also build, build/include, CUDA and cuDNN include folders.
* Goto Additional Library Directories and add the path to openblas, protobuf and glog libraries. Add also build/src/singa_objects.dir/Release, singa-kernel, cnmem, CUDA and cuDNN library paths.
* Goto Additional Dependencies and add libopenblas.lib; libglog.lib; libprotobuf.lib; cnmem.lib; cudnn.lib; cuda.lib; cublas.lib; curand.lib; cudart.lib; singa-kernel.lib. Fix the names of the two libraries: gtest.lib and singa_objects.lib.
* Build test_singa project.
* Make libglog.dll, libopenblas.dll, cnmem.dll, cudart64_91.dll and cudnn64_7.dll available by adding them to the path or by copying them to test/release folder
* The unit tests can be executed
* From the command line:
.. code-block:: bash
test_singa.exe
* From Visual Studio:
* right click on the test_singa project and choose 'Set as StartUp Project'.
* from the Debug menu, choose 'Start Without Debugging'
A video tutorial for running the unit tests can be found here:
.. |video| image:: https://img.youtube.com/vi/YOjwtrvTPn4/0.jpg
:scale: 100%
:align: middle
:target: https://www.youtube.com/watch?v=YOjwtrvTPn4
+---------+
| |video| |
+---------+