/Cross-Compile-Jetson

Cross compile on X86 host for Jetson

Primary LanguageShell

Cross compile

Note: pls refer to https://developer.nvidia.com/embedded/downloads for the latest update on the image.

The latest version of jetpack is 28.5 for now, feel free to update the link I attached as default.

Host:

Ubuntu 18.04

Target:

Jetson Nano

1. Prepare the build enviroment

1. Download the Roofs Image from jetpack

jetson-nano-sd-r32.1-2019-03-18.zip

2. change to root user
  alan@C:~$ sudo su - root
  root@C:~# mkdir -p /home/alan/rootfs-nano
  root@C:~# cd /home/alan/rootfs-nano && cp /home/alan/Downloads/jetson-nano-sd-r32.1-2019-03-18.zip .
  root@C:~# unzip jetson-nano-sd-r32.1-2019-03-18.zip 
  root@C:~# ls
  root@C:~# fdisk jetson-nano-sd-r32.1-2019-03-18.img
	Welcome to fdisk (util-linux 2.31.1).
	Changes will remain in memory only, until you decide to write them.
	Be careful before using the write command.
	
	
	Command (m for help): p
	Disk jetson-nano-sd-r32.1-2019-03-18.img: 12 GiB, 12884901888 bytes, 25165824 sectors
	Units: sectors of 1 * 512 = 512 bytes
	Sector size (logical/physical): 512 bytes / 512 bytes
	I/O size (minimum/optimal): 512 bytes / 512 bytes
	Disklabel type: gpt
	Disk identifier: D048AD43-24FD-4DED-B06E-7BB8ED98158C
	
	Device                                Start      End  Sectors  Size Type
	jetson-nano-sd-r32.1-2019-03-18.img1  24576 25165790 25141215   12G Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img2   2048     2303      256  128K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img3   4096     4991      896  448K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img4   6144     7295     1152  576K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img5   8192     8319      128   64K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img6  10240    10623      384  192K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img7  12288    13439     1152  576K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img8  14336    14463      128   64K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img9  16384    17663     1280  640K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img10 18432    19327      896  448K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img11 20480    20735      256  128K Linux filesystem
	jetson-nano-sd-r32.1-2019-03-18.img12 22528    22687      160   80K Linux filesystem
	
	Partition table entries are not in disk order.
	
	Command (m for help): 

From here you can see the rootfs start from block 24576 with block size 512bytes. So We need to mount the image from offset 24576 * 512 = 12582912

  root@C:~# mount -o loop,offset=12582912 jetson-nano-sd-r32.1-2019-03-18.img /mnt
  root@C:~# ls /mnt/
	bin  boot  dev  etc  home  lib  lost+found  media  mnt  mxnet  opt  proc  README.txt  root  run  sbin  snap  srv  sys  tmp  usr  var
  root@C:~#

I recommand to cp all the files from image to the local folder. because all the changes under /mnt will change the origin image, and also there is a size limitation from Image. Here its max size is 12GB. Maybe not enough for the later use.

  root@C:~# cp /mnt/*  /home/alan/rootfs-nano -rapvf
  root@C:~#  apt install qemu-user-static
  root@C:~# cp /usr/bin/qemu-arm-static usr/bin/
  root@C:~# cp /usr/bin/qemu-aarch64-static usr/bin/
  root@C:~# 

Here is a mount shell script (ch-mount.sh) to help chroot to the target file system. Here we use qemu to setup a simulation to install and get some packages conveniently. Of course you can copy from a real device.

	#!/bin/bash
	
	function mnt() {
	    echo "MOUNTING"
	    sudo mount -t proc /proc ${2}proc
	    sudo mount -t sysfs /sys ${2}sys
	    sudo mount -o bind /dev ${2}dev
	    sudo mount -o bind /run ${2}run
	    #sudo mount -vt tmpfs shm ${2}dev/shm
	    #sudo mount -t /dev/shm ${2}dev/shm
	    sudo chroot ${2}
	}
	
	function umnt() {
	    echo "UNMOUNTING"
	    sudo umount ${2}proc
	    sudo umount ${2}sys
	    #sudo umount ${2}dev/shm
	    sudo umount ${2}dev
	    sudo umount ${2}run
	    sudo umount ${2}host
	}
	
	
	if [ "$1" == "-m" ] && [ -n "$2" ] ;
	then
	    mnt $1 $2
	elif [ "$1" == "-u" ] && [ -n "$2" ];
	then
	    umnt $1 $2
	else
	    echo ""
	    echo "Either 1'st, 2'nd or both parameters were missing"
	    echo ""
	    echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
	    echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
	    echo ""
	    echo "For example: ch-mount -m /media/sdcard/"
	    echo ""
	    echo 1st parameter : ${1}
	    echo 2nd parameter : ${2}
	fi

root@C:~# cp /etc/resolv.conf etc/
root@C:~# bash ch-mount.sh -m rootfs-nano 

Now you entered a simulation system and experience just like you are on target board. It's usefull to get some packages and dependency libs without a dev kit board on hand.

root@C:/# apt update
root@C:/# 

Keep the session for the target, open another session for the Host.

2. Get the source code.

git clone --recursive https://github.com/dmlc/mxnet

3. Install the dependency

Install the dependency on the Host and Target in the same time.

sudo apt-get update
sudo apt-get install -y \
    apt-transport-https \
    build-essential \
    ca-certificates \
    cmake \
    curl \
    git \
    libatlas-base-dev \
    libcurl4-openssl-dev \
    libjemalloc-dev \
    liblapack-dev \
    libopenblas-dev \
    libopencv-dev \
    libzmq3-dev \
    ninja-build \
    python-dev \
    python3-dev \
    software-properties-common \
    sudo \
    unzip \
    virtualenv \
    wget

Install the python dependency on the Host and Target. You can find the requirements.txt under docs/install/

wget -nv https://bootstrap.pypa.io/get-pip.py
echo "Installing for Python 3..."
sudo python3 get-pip.py
pip3 install --user -r requirements.txt
echo "Installing for Python 2..."
sudo python2 get-pip.py
pip2 install --user -r requirements.txt

From now on, there are two possible ways to compiling the mxnet. You can chose step 4 or step 5.

4. Build under qemu simulation

root@C:/# mv mxnet ./
root@C:/#cd mxnet
root@C:/#cp make/config.mk .

From jetson-nano-sd-r32.1-2019-03-18.zip official release Opencv 3.3.1 CUDA 10.0, Cudnn and TensorRT and pre-installed. If you want to use mxnet with CPP version, try to compile with USE_CPP_PACKAGE=1

root@C:/#make -j  $(nproc) USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1
lan@C:~/src/mxnet$ make -j  $(nproc) USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1

alan@C:~/src/mxnet$ cd python &&  python setup.py bdist_wheel &&  python3 setup.py bdist_wheel
alan@C:~/src/mxnet/python$ ls dist/ 
alan@C:~/src/mxnet/python$ dist/mxnet-1.5.0-py2-none-any.whl  dist/mxnet-1.5.0-py3-none-any.whl
alan@C:~/src/mxnet/python$ls ../lib
../lib/libmxnet.a  ../lib/libmxnet.so
alan@C:~/src/mxnet$  scp ../lib/libmxnet.so dist/* jetbot@(ip):~/

It will cost u several hours depend on your CPU version. For the speed direct build > cross-compile > compile under simulation.

5. Build on the x86 Host with cross compile toolchain

Download the cross compile toolchain from Jetpack.

We just need the gcc-4.8.5-aarch64.tgz for mxnet. if you want to cross compile the kernel gcc-4.8.5-armhf.tgz is also required.

alan@C:~/toolchain$ tar xpvf gcc-4.8.5-aarch64.tgz
alan@C:~/toolchain$ mv install gcc-4.8.5-aarch64
alan@C:~/toolchain$ 

alan@C:~/toolchain/gcc-4.8.5-aarch64$ tree -d -L 2
.
├── aarch64-unknown-linux-gnu
│   ├── bin
│   ├── include
│   ├── lib
│   ├── lib64
│   └── sysroot
├── bin
├── include
├── lib
│   └── gcc
├── libexec
│   └── gcc
└── share
    ├── gcc-4.8.5
    ├── info
    ├── locale
    └── man

17 directories

You can see there are two key folders sysroot and bin. From sysroot, you can get the basic libs used by the gcc/g++. From bin, you can get the compile tools: gcc, g++,ar,ld...

On the target:

root@C:/# rm /usr/include/aarch64-linux-gnu/cblas.h 
root@C:/# cp /usr/include/aarch64-linux-gnu/cblas-openblas.h /usr/	include/aarch64-linux-gnu/cblas.h

On the Host:

alan@C:~/src/mxnet$ 
alan@C:~/src/mxnet$ cp make/config.mk .

export CROSS_ROOT=/home/alan/rootfs-nano
export CROSS_COMPILE = /home/alan/toolchain/gcc-4.8.5-aarch64/bin
export CC = ${CROSS_COMPILE}/aarch64-unknown-linux-gnu-gcc
export CXX = ${CROSS_COMPILE}/aarch64-unknown-linux-gnu-g++
export LD = ${CROSS_COMPILE}/aarch64-unknown-linux-gnu-ld
export AR = ${CROSS_COMPILE}/aarch64-unknown-linux-gnu-ar
export AS = ${CROSS_COMPILE}/aarch64-unknown-linux-gnu-as
export RANLIB = ${CROSS_COMPILE}/aarch64-unknown-linux-gnu-ranlib
export NVCC = ${CROSS_ROOT}/usr/local/cuda/bin/nvcc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SYSROOT/usr/lib/aarch64-linux-gnu:$SYSROOT/lib/aarch64-linux-gnu:$SYSROOT/lib
export LC_ALL=C
sudo ln -s /home/alan/rootfs-nano/usr/lib/aarch64-linux-gnu/libcudnn.so.7 /home/alan/rootfs-nano/usr/lib/aarch64-linux-gnu/libcudnn.so
/home/alan/rootfs-nano/usr/lib/aarch64-linux-gnu/libcudnn.so -> /home/alan/rootfs-nano/usr/lib/aarch64-linux-gnu/libcudnn.so.7

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/alan/toolchain/gcc-4.8.5-aarch64/aarch64-unknown-linux-gnu/lib64:/home/alan/toolchain/gcc-4.8.5-aarch64/aarch64-unknown-linux-gnu/sysroot/lib

alan@C:~/src/mxnet$ vim config.mk

# the additional link flags you want to add
ADD_LDFLAGS =  -L${CROSS_ROOT}/lib \
                   -L${CROSS_ROOT}/usr/local/cuda/lib64 \
                   -L${CROSS_ROOT}/usr/lib \
                   -L${CROSS_ROOT}/usr/lib/aarch64-linux-gnu \
                   -L${CROSS_ROOT}/lib/aarch64-linux-gnu

# the additional compile flags you want to add
ADD_CFLAGS = -I${CROSS_ROOT}/include \
                -I${CROSS_ROOT}/usr/local/cuda/include \
                -I${CROSS_ROOT}/usr/include \
                -I${CROSS_ROOT}/usr/include/aarch64-linux-gnu

alan@C:~/src/mxnet$ make -j  $(nproc) USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1
alan@C:~/src/mxnet$ cd python &&  python setup.py bdist_wheel &&  python3 setup.py bdist_wheel
alan@C:~/src/mxnet/python$ ls dist/ 
alan@C:~/src/mxnet/python$ dist/mxnet-1.5.0-py2-none-any.whl  dist/mxnet-1.5.0-py3-none-any.whl
alan@C:~/src/mxnet/python$ls ../lib
../lib/libmxnet.a  ../lib/libmxnet.so
alan@C:~/src/mxnet$  scp ../lib/libmxnet.so dist/* jetbot@(ip):~/

Then you can try on your Nano dev kit to run the mxnet.

6. Try on the Nano dev kit

jetbot@jetbot:~$ sudo -H pip3 install mxnet-1.5.0-py3-none-any.whl
[sudo] password for jetbot: 
Processing ./mxnet-1.5.0-py3-none-any.whl
Collecting graphviz<0.9.0,>=0.8.1 (from mxnet==1.5.0)
Downloading https://files.pythonhosted.org/packages/53/39/4ab213673844e0c004bed8a0781a0721a3f6bb23eb8854ee75c236428892/graphviz-0.8.4-py2.py3-none-any.whl
Collecting numpy<=1.15.2,>=1.8.2 (from mxnet==1.5.0)
Downloading https://files.pythonhosted.org/packages/45/ba/2a781ebbb0cd7962cc1d12a6b65bd4eff57ffda449fdbbae4726dc05fbc3/numpy-1.15.2.zip (4.5MB)
100% |████████████████████████████████| 4.5MB 21kB/s 
Requirement already satisfied: requests<3,>=2.20.0 in /usr/local/lib/python3.6/dist-packages (from mxnet==1.5.0)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.20.0->mxnet==1.5.0)
Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.20.0->mxnet==1.5.0)
Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.20.0->mxnet==1.5.0)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/lib/python3/dist-packages (from requests<3,>=2.20.0->mxnet==1.5.0)
Building wheels for collected packages: numpy
Running setup.py bdist_wheel for numpy ... -
done
Stored in directory: /root/.cache/pip/wheels/3a/4d/27/ceb4416e50c3522656d512ef7736c69778241337afdc6506f0
Successfully built numpy
Installing collected packages: graphviz, numpy, mxnet
Found existing installation: numpy 1.16.2
Uninstalling numpy-1.16.2:
Not removing or modifying (outside of prefix):
/usr/bin/f2py
Successfully uninstalled numpy-1.16.2
Successfully installed graphviz-0.8.4 mxnet-1.5.0 numpy-1.15.2
jetbot@jetbot:~$ 
jetbot@jetbot:~$ 
jetbot@jetbot:~$ cp libmxnet.so /usr/local/lib/python3.6/dist-packages/mxnet/

jetbot@jetbot:~$ python3

>>> import mxnet as mx
>>> a = mx.nd.ones((2, 3), mx.gpu())
>>> print(a)
[[1. 1. 1.]
[1. 1. 1.]]
<NDArray 2x3 @gpu(0)>
>>> 

jetbot@jetbot:~/mxnet/example/image-classification$

jetbot@jetbot:~/mxnet/example/image-classification$ python3 train_mnist.py --network mlp --gpus 0

INFO:root:start with arguments Namespace(add_stn=False, batch_size=64, disp_batches=100, dtype='float32', gc_threshold=0.5, gc_type='none', gpus='0', image_shape='1, 28, 28', initializer='default', kv_store='device', load_epoch=None, loss='', lr=0.05, lr_factor=0.1, lr_step_epochs='10', macrobatch_size=0, model_prefix=None, mom=0.9, monitor=0, network='mlp', num_classes=10, num_epochs=20, num_examples=60000, num_layers=None, optimizer='sgd', profile_server_suffix='', profile_worker_suffix='', save_period=1, test_io=0, top_k=0, warmup_epochs=5, warmup_strategy='linear', wd=0.0001)                                                                                ß  Stalled here for more than 30 minutes.

INFO:root:Epoch[0] Batch [0-100]           Speed: 384.49 samples/sec       accuracy=0.792543

INFO:root:Epoch[0] Batch [100-200]       Speed: 5787.71 samples/sec       accuracy=0.907344

INFO:root:Epoch[0] Batch [200-300]       Speed: 5832.54 samples/sec       accuracy=0.922969

INFO:root:Epoch[0] Batch [300-400]       Speed: 6656.61 samples/sec       accuracy=0.932500

INFO:root:Epoch[0] Batch [400-500]       Speed: 6621.90 samples/sec       accuracy=0.943906

INFO:root:Epoch[0] Batch [500-600]       Speed: 6929.24 samples/sec       accuracy=0.950781

INFO:root:Epoch[0] Batch [600-700]       Speed: 6786.66 samples/sec       accuracy=0.955937

INFO:root:Epoch[0] Batch [700-800]       Speed: 2623.34 samples/sec       accuracy=0.948125

INFO:root:Epoch[0] Batch [800-900]       Speed: 1032.81 samples/sec       accuracy=0.962969

INFO:root:Epoch[0] Train-accuracy=0.925207

INFO:root:Epoch[0] Time cost=49.278

INFO:root:Epoch[0] Validation-accuracy=0.955016

INFO:root:Epoch[1] Batch [0-100]           Speed: 6950.49 samples/sec       accuracy=0.962252

INFO:root:Epoch[1] Batch [100-200]       Speed: 7785.90 samples/sec       accuracy=0.970781

INFO:root:Epoch[1] Batch [200-300]       Speed: 7657.41 samples/sec       accuracy=0.967031

INFO:root:Epoch[1] Batch [300-400]       Speed: 7684.37 samples/sec       accuracy=0.970313

INFO:root:Epoch[1] Batch [400-500]       Speed: 7743.24 samples/sec       accuracy=0.968594

INFO:root:Epoch[1] Batch [500-600]       Speed: 7599.39 samples/sec       accuracy=0.970000

INFO:root:Epoch[1] Batch [600-700]       Speed: 7740.98 samples/sec       accuracy=0.966719

INFO:root:Epoch[1] Batch [700-800]       Speed: 3212.82 samples/sec       accuracy=0.961719

INFO:root:Epoch[1] Batch [800-900]       Speed: 7713.07 samples/sec       accuracy=0.964844

INFO:root:Epoch[1] Train-accuracy=0.966851

INFO:root:Epoch[1] Time cost=49.322

INFO:root:Epoch[1] Validation-accuracy=0.968949

INFO:root:Epoch[2] Batch [0-100]           Speed: 7194.21 samples/sec       accuracy=0.976640

INFO:root:Epoch[2] Batch [100-200]       Speed: 7518.82 samples/sec       accuracy=0.973594

INFO:root:Epoch[2] Batch [200-300]       Speed: 7716.33 samples/sec       accuracy=0.977031

INFO:root:Epoch[2] Batch [300-400]       Speed: 7598.45 samples/sec       accuracy=0.970625

INFO:root:Epoch[2] Batch [400-500]       Speed: 7702.49 samples/sec       accuracy=0.978594

INFO:root:Epoch[2] Batch [500-600]       Speed: 7055.96 samples/sec       accuracy=0.975469

INFO:root:Epoch[2] Batch [600-700]       Speed: 6993.81 samples/sec       accuracy=0.973906

INFO:root:Epoch[2] Batch [700-800]       Speed: 6676.73 samples/sec       accuracy=0.972344

INFO:root:Epoch[2] Batch [800-900]       Speed: 6278.27 samples/sec       accuracy=0.974219

INFO:root:Epoch[2] Train-accuracy=0.974863

INFO:root:Epoch[2] Time cost=12.134

INFO:root:Epoch[2] Validation-accuracy=0.968850

INFO:root:Epoch[3] Batch [0-100]           Speed: 6558.14 samples/sec       accuracy=0.984684

INFO:root:Epoch[3] Batch [100-200]       Speed: 6813.82 samples/sec       accuracy=0.983750

INFO:root:Epoch[3] Batch [200-300]       Speed: 6754.34 samples/sec       accuracy=0.980625

INFO:root:Epoch[3] Batch [300-400]       Speed: 7618.14 samples/sec       accuracy=0.981563

INFO:root:Epoch[3] Batch [400-500]       Speed: 7681.15 samples/sec       accuracy=0.976406

INFO:root:Epoch[3] Batch [500-600]       Speed: 7269.36 samples/sec       accuracy=0.982031

INFO:root:Epoch[3] Batch [600-700]       Speed: 7719.15 samples/sec       accuracy=0.979688

INFO:root:Epoch[3] Batch [700-800]       Speed: 7709.22 samples/sec       accuracy=0.977031

INFO:root:Epoch[3] Batch [800-900]       Speed: 7677.59 samples/sec       accuracy=0.979844

INFO:root:Epoch[3] Train-accuracy=0.980377

INFO:root:Epoch[3] Time cost=8.234

INFO:root:Epoch[3] Validation-accuracy=0.966262

INFO:root:Epoch[4] Batch [0-100]           Speed: 7132.62 samples/sec       accuracy=0.987160

INFO:root:Epoch[4] Batch [100-200]       Speed: 7585.20 samples/sec       accuracy=0.985156

INFO:root:Epoch[4] Batch [200-300]       Speed: 7396.47 samples/sec       accuracy=0.983750

INFO:root:Epoch[4] Batch [300-400]       Speed: 7244.32 samples/sec       accuracy=0.981406

INFO:root:Epoch[4] Batch [400-500]       Speed: 7711.92 samples/sec       accuracy=0.984531

INFO:root:Epoch[4] Batch [500-600]       Speed: 7503.01 samples/sec       accuracy=0.984375

INFO:root:Epoch[4] Batch [600-700]       Speed: 7093.56 samples/sec       accuracy=0.983594

INFO:root:Epoch[4] Batch [700-800]       Speed: 6708.77 samples/sec       accuracy=0.980469

INFO:root:Epoch[4] Batch [800-900]       Speed: 7104.40 samples/sec       accuracy=0.978906

INFO:root:Epoch[4] Train-accuracy=0.983209

INFO:root:Epoch[4] Time cost=8.285

INFO:root:Epoch[4] Validation-accuracy=0.973229

INFO:root:Epoch[5] Batch [0-100]           Speed: 6717.93 samples/sec       accuracy=0.987624

INFO:root:Epoch[5] Batch [100-200]       Speed: 6831.01 samples/sec       accuracy=0.987969

INFO:root:Epoch[5] Batch [200-300]       Speed: 6654.78 samples/sec       accuracy=0.987187

INFO:root:Epoch[5] Batch [300-400]       Speed: 6516.86 samples/sec       accuracy=0.983750

INFO:root:Epoch[5] Batch [400-500]       Speed: 7060.14 samples/sec       accuracy=0.985313

INFO:root:Epoch[5] Batch [500-600]       Speed: 7134.15 samples/sec       accuracy=0.985781

INFO:root:Epoch[5] Batch [600-700]       Speed: 6789.76 samples/sec       accuracy=0.984531

INFO:root:Epoch[5] Batch [700-800]       Speed: 6345.85 samples/sec       accuracy=0.984375

INFO:root:Epoch[5] Batch [800-900]       Speed: 6559.54 samples/sec       accuracy=0.982812

INFO:root:Epoch[5] Train-accuracy=0.985358

INFO:root:Epoch[5] Time cost=8.901

INFO:root:Epoch[5] Validation-accuracy=0.974522

INFO:root:Epoch[6] Batch [0-100]           Speed: 7061.36 samples/sec       accuracy=0.988088

INFO:root:Epoch[6] Batch [100-200]       Speed: 6756.23 samples/sec       accuracy=0.987500

INFO:root:Epoch[6] Batch [200-300]       Speed: 6816.89 samples/sec       accuracy=0.990469

INFO:root:Epoch[6] Batch [300-400]       Speed: 7260.03 samples/sec       accuracy=0.986719

INFO:root:Epoch[6] Batch [400-500]       Speed: 7821.27 samples/sec       accuracy=0.988906

INFO:root:Epoch[6] Batch [500-600]       Speed: 7780.85 samples/sec       accuracy=0.985781

INFO:root:Epoch[6] Batch [600-700]       Speed: 7909.90 samples/sec       accuracy=0.983281

INFO:root:Epoch[6] Batch [700-800]       Speed: 7806.16 samples/sec       accuracy=0.984062

INFO:root:Epoch[6] Batch [800-900]       Speed: 7830.59 samples/sec       accuracy=0.984219

INFO:root:Epoch[6] Train-accuracy=0.986491

INFO:root:Epoch[6] Time cost=8.077

INFO:root:Epoch[6] Validation-accuracy=0.973428

INFO:root:Epoch[7] Batch [0-100]           Speed: 6781.99 samples/sec       accuracy=0.988088

INFO:root:Epoch[7] Batch [100-200]       Speed: 7547.77 samples/sec       accuracy=0.991406

INFO:root:Epoch[7] Batch [200-300]       Speed: 7413.78 samples/sec       accuracy=0.988750

INFO:root:Epoch[7] Batch [300-400]       Speed: 7476.73 samples/sec       accuracy=0.986250

INFO:root:Epoch[7] Batch [400-500]       Speed: 6828.87 samples/sec       accuracy=0.987812

INFO:root:Epoch[7] Batch [500-600]       Speed: 7022.49 samples/sec       accuracy=0.986719

INFO:root:Epoch[7] Batch [600-700]       Speed: 7086.06 samples/sec       accuracy=0.988437

INFO:root:Epoch[7] Batch [700-800]       Speed: 6705.74 samples/sec       accuracy=0.989062

INFO:root:Epoch[7] Batch [800-900]       Speed: 6721.79 samples/sec       accuracy=0.988437

INFO:root:Epoch[7] Train-accuracy=0.988406

INFO:root:Epoch[7] Time cost=8.530

INFO:root:Epoch[7] Validation-accuracy=0.976712

INFO:root:Epoch[8] Batch [0-100]           Speed: 7057.77 samples/sec       accuracy=0.991182

INFO:root:Epoch[8] Batch [100-200]       Speed: 6905.11 samples/sec       accuracy=0.991250

INFO:root:Epoch[8] Batch [200-300]       Speed: 6065.71 samples/sec       accuracy=0.990938

INFO:root:Epoch[8] Batch [300-400]       Speed: 7098.99 samples/sec       accuracy=0.992969

INFO:root:Epoch[8] Batch [400-500]       Speed: 7440.78 samples/sec       accuracy=0.989375

INFO:root:Epoch[8] Batch [500-600]       Speed: 6827.90 samples/sec       accuracy=0.988125

INFO:root:Epoch[8] Batch [600-700]       Speed: 7010.63 samples/sec       accuracy=0.987344

INFO:root:Epoch[8] Batch [700-800]       Speed: 6836.65 samples/sec       accuracy=0.989531

INFO:root:Epoch[8] Batch [800-900]       Speed: 6714.49 samples/sec       accuracy=0.990156

INFO:root:Epoch[8] Train-accuracy=0.990189

INFO:root:Epoch[8] Time cost=8.715

INFO:root:Epoch[8] Validation-accuracy=0.978304

INFO:root:Epoch[9] Batch [0-100]           Speed: 2873.93 samples/sec       accuracy=0.993502

INFO:root:Epoch[9] Batch [100-200]       Speed: 7751.53 samples/sec       accuracy=0.993750

INFO:root:Epoch[9] Batch [200-300]       Speed: 7210.08 samples/sec       accuracy=0.993750

INFO:root:Epoch[9] Batch [300-400]       Speed: 6930.71 samples/sec       accuracy=0.990625

INFO:root:Epoch[9] Batch [400-500]       Speed: 6811.26 samples/sec       accuracy=0.992031

INFO:root:Epoch[9] Batch [500-600]       Speed: 7201.69 samples/sec       accuracy=0.992344

INFO:root:Epoch[9] Batch [600-700]       Speed: 7046.69 samples/sec       accuracy=0.989688

INFO:root:Epoch[9] Batch [700-800]       Speed: 6879.57 samples/sec       accuracy=0.989531

INFO:root:Epoch[9] Batch [800-900]       Speed: 6949.82 samples/sec       accuracy=0.990938

INFO:root:Epoch[9] Train-accuracy=0.991604

INFO:root:Epoch[9] Time cost=9.796

INFO:root:Epoch[9] Validation-accuracy=0.977807

INFO:root:Update[9381]: Change learning rate to 5.00000e-03

INFO:root:Epoch[10] Batch [0-100]         Speed: 7560.03 samples/sec       accuracy=0.995204

INFO:root:Epoch[10] Batch [100-200]     Speed: 7670.29 samples/sec       accuracy=0.995156

INFO:root:Epoch[10] Batch [200-300]     Speed: 7031.70 samples/sec       accuracy=0.996719

INFO:root:Epoch[10] Batch [300-400]     Speed: 6986.30 samples/sec       accuracy=0.997188

INFO:root:Epoch[10] Batch [400-500]     Speed: 6982.47 samples/sec       accuracy=0.996875

INFO:root:Epoch[10] Batch [500-600]     Speed: 6254.96 samples/sec       accuracy=0.998125

INFO:root:Epoch[10] Batch [600-700]     Speed: 6521.39 samples/sec       accuracy=0.997969

INFO:root:Epoch[10] Batch [700-800]     Speed: 7111.24 samples/sec       accuracy=0.997500

INFO:root:Epoch[10] Batch [800-900]     Speed: 6804.36 samples/sec       accuracy=0.997188

INFO:root:Epoch[10] Train-accuracy=0.996935

INFO:root:Epoch[10] Time cost=8.622

INFO:root:Epoch[10] Validation-accuracy=0.981489

INFO:root:Epoch[11] Batch [0-100]         Speed: 6861.43 samples/sec       accuracy=0.998917

INFO:root:Epoch[11] Batch [100-200]     Speed: 7738.59 samples/sec       accuracy=0.998750

INFO:root:Epoch[11] Batch [200-300]     Speed: 7849.19 samples/sec       accuracy=0.999062

INFO:root:Epoch[11] Batch [300-400]     Speed: 7869.54 samples/sec       accuracy=0.997812

INFO:root:Epoch[11] Batch [400-500]     Speed: 7725.69 samples/sec       accuracy=0.998281

INFO:root:Epoch[11] Batch [500-600]     Speed: 7836.53 samples/sec       accuracy=0.998906

INFO:root:Epoch[11] Batch [600-700]     Speed: 7829.49 samples/sec       accuracy=0.998750

INFO:root:Epoch[11] Batch [700-800]     Speed: 7340.69 samples/sec       accuracy=0.999062

INFO:root:Epoch[11] Batch [800-900]     Speed: 6904.03 samples/sec       accuracy=0.998594

INFO:root:Epoch[11] Train-accuracy=0.998701

INFO:root:Epoch[11] Time cost=8.001

INFO:root:Epoch[11] Validation-accuracy=0.981887

INFO:root:Epoch[12] Batch [0-100]         Speed: 6447.06 samples/sec       accuracy=0.999226

INFO:root:Epoch[12] Batch [100-200]     Speed: 6991.28 samples/sec       accuracy=0.999219

INFO:root:Epoch[12] Batch [200-300]     Speed: 7002.68 samples/sec       accuracy=0.999219

INFO:root:Epoch[12] Batch [300-400]     Speed: 6838.79 samples/sec       accuracy=0.999219

INFO:root:Epoch[12] Batch [400-500]     Speed: 6219.15 samples/sec       accuracy=0.999687

INFO:root:Epoch[12] Batch [500-600]     Speed: 6687.89 samples/sec       accuracy=0.999375

INFO:root:Epoch[12] Batch [600-700]     Speed: 7101.46 samples/sec       accuracy=0.999375

INFO:root:Epoch[12] Batch [700-800]     Speed: 6946.48 samples/sec       accuracy=0.997812

INFO:root:Epoch[12] Batch [800-900]     Speed: 6832.06 samples/sec       accuracy=0.999375

INFO:root:Epoch[12] Train-accuracy=0.999150

INFO:root:Epoch[12] Time cost=8.875

INFO:root:Epoch[12] Validation-accuracy=0.982385

INFO:root:Epoch[13] Batch [0-100]         Speed: 7207.45 samples/sec       accuracy=0.999226

INFO:root:Epoch[13] Batch [100-200]     Speed: 7596.22 samples/sec       accuracy=0.999375

INFO:root:Epoch[13] Batch [200-300]     Speed: 7676.46 samples/sec       accuracy=0.999375

INFO:root:Epoch[13] Batch [300-400]     Speed: 7670.06 samples/sec       accuracy=0.999844

INFO:root:Epoch[13] Batch [400-500]     Speed: 7705.11 samples/sec       accuracy=0.999062

INFO:root:Epoch[13] Batch [500-600]     Speed: 7085.65 samples/sec       accuracy=0.999375

INFO:root:Epoch[13] Batch [600-700]     Speed: 7030.00 samples/sec       accuracy=0.999687

INFO:root:Epoch[13] Batch [700-800]     Speed: 6896.02 samples/sec       accuracy=0.999375

INFO:root:Epoch[13] Batch [800-900]     Speed: 7133.44 samples/sec       accuracy=0.999844

INFO:root:Epoch[13] Train-accuracy=0.999450

INFO:root:Epoch[13] Time cost=8.225

INFO:root:Epoch[13] Validation-accuracy=0.982683

INFO:root:Epoch[14] Batch [0-100]         Speed: 6853.73 samples/sec       accuracy=0.999536

INFO:root:Epoch[14] Batch [100-200]     Speed: 6765.78 samples/sec       accuracy=0.998906

INFO:root:Epoch[14] Batch [200-300]     Speed: 6859.40 samples/sec       accuracy=0.999687

INFO:root:Epoch[14] Batch [300-400]     Speed: 6943.70 samples/sec       accuracy=0.999844

INFO:root:Epoch[14] Batch [400-500]     Speed: 6714.22 samples/sec       accuracy=0.999375

INFO:root:Epoch[14] Batch [500-600]     Speed: 6740.48 samples/sec       accuracy=0.999687

INFO:root:Epoch[14] Batch [600-700]     Speed: 6989.69 samples/sec       accuracy=0.999687

INFO:root:Epoch[14] Batch [700-800]     Speed: 7070.55 samples/sec       accuracy=0.999062

INFO:root:Epoch[14] Batch [800-900]     Speed: 6485.62 samples/sec       accuracy=0.999375

INFO:root:Epoch[14] Train-accuracy=0.999467

INFO:root:Epoch[14] Time cost=8.851

INFO:root:Epoch[14] Validation-accuracy=0.982982

INFO:root:Epoch[15] Batch [0-100]         Speed: 6746.59 samples/sec       accuracy=0.999691

INFO:root:Epoch[15] Batch [100-200]     Speed: 6764.30 samples/sec       accuracy=0.999531

INFO:root:Epoch[15] Batch [200-300]     Speed: 6768.51 samples/sec       accuracy=0.999844

INFO:root:Epoch[15] Batch [300-400]     Speed: 7559.36 samples/sec       accuracy=0.999687

INFO:root:Epoch[15] Batch [400-500]     Speed: 7612.26 samples/sec       accuracy=0.999687

INFO:root:Epoch[15] Batch [500-600]     Speed: 7683.53 samples/sec       accuracy=0.999375

INFO:root:Epoch[15] Batch [600-700]     Speed: 7607.47 samples/sec       accuracy=0.999219

INFO:root:Epoch[15] Batch [700-800]     Speed: 7594.29 samples/sec       accuracy=0.999375

INFO:root:Epoch[15] Batch [800-900]     Speed: 7624.58 samples/sec       accuracy=0.999687

INFO:root:Epoch[15] Train-accuracy=0.999550

INFO:root:Epoch[15] Time cost=8.225

INFO:root:Epoch[15] Validation-accuracy=0.982882

INFO:root:Epoch[16] Batch [0-100]         Speed: 6726.05 samples/sec       accuracy=0.999691

INFO:root:Epoch[16] Batch [100-200]     Speed: 7255.02 samples/sec       accuracy=0.999531

INFO:root:Epoch[16] Batch [200-300]     Speed: 7027.10 samples/sec       accuracy=0.999844

INFO:root:Epoch[16] Batch [300-400]     Speed: 6747.99 samples/sec       accuracy=1.000000

INFO:root:Epoch[16] Batch [400-500]     Speed: 7269.80 samples/sec       accuracy=0.999844

INFO:root:Epoch[16] Batch [500-600]     Speed: 6959.22 samples/sec       accuracy=0.999531

INFO:root:Epoch[16] Batch [600-700]     Speed: 6888.03 samples/sec       accuracy=0.999062

INFO:root:Epoch[16] Batch [700-800]     Speed: 7021.84 samples/sec       accuracy=0.999375

INFO:root:Epoch[16] Batch [800-900]     Speed: 6949.42 samples/sec       accuracy=0.999375

INFO:root:Epoch[16] Train-accuracy=0.999567

INFO:root:Epoch[16] Time cost=8.629

INFO:root:Epoch[16] Validation-accuracy=0.983380

INFO:root:Epoch[17] Batch [0-100]         Speed: 7386.52 samples/sec       accuracy=1.000000

INFO:root:Epoch[17] Batch [100-200]     Speed: 7373.56 samples/sec       accuracy=0.999687

INFO:root:Epoch[17] Batch [200-300]     Speed: 7590.39 samples/sec       accuracy=0.999687

INFO:root:Epoch[17] Batch [300-400]     Speed: 7731.31 samples/sec       accuracy=0.999531

INFO:root:Epoch[17] Batch [400-500]     Speed: 7520.23 samples/sec       accuracy=0.999531

INFO:root:Epoch[17] Batch [500-600]     Speed: 7794.80 samples/sec       accuracy=0.999531

INFO:root:Epoch[17] Batch [600-700]     Speed: 7598.25 samples/sec       accuracy=0.999687

INFO:root:Epoch[17] Batch [700-800]     Speed: 7580.17 samples/sec       accuracy=0.999844

INFO:root:Epoch[17] Batch [800-900]     Speed: 7644.90 samples/sec       accuracy=0.999375

INFO:root:Epoch[17] Train-accuracy=0.999667

INFO:root:Epoch[17] Time cost=7.927

INFO:root:Epoch[17] Validation-accuracy=0.983181

INFO:root:Epoch[18] Batch [0-100]         Speed: 7525.07 samples/sec       accuracy=0.999691

INFO:root:Epoch[18] Batch [100-200]     Speed: 7613.25 samples/sec       accuracy=0.999687

INFO:root:Epoch[18] Batch [200-300]     Speed: 7727.97 samples/sec       accuracy=0.999687

INFO:root:Epoch[18] Batch [300-400]     Speed: 7771.97 samples/sec       accuracy=1.000000

INFO:root:Epoch[18] Batch [400-500]     Speed: 7839.33 samples/sec       accuracy=0.999844

INFO:root:Epoch[18] Batch [500-600]     Speed: 7815.90 samples/sec       accuracy=0.999844

INFO:root:Epoch[18] Batch [600-700]     Speed: 7742.46 samples/sec       accuracy=0.999687

INFO:root:Epoch[18] Batch [700-800]     Speed: 7787.28 samples/sec       accuracy=0.999687

INFO:root:Epoch[18] Batch [800-900]     Speed: 7538.95 samples/sec       accuracy=0.999531

INFO:root:Epoch[18] Train-accuracy=0.999750

INFO:root:Epoch[18] Time cost=7.808

INFO:root:Epoch[18] Validation-accuracy=0.982584

INFO:root:Epoch[19] Batch [0-100]         Speed: 6449.32 samples/sec       accuracy=1.000000

INFO:root:Epoch[19] Batch [100-200]     Speed: 6936.59 samples/sec       accuracy=0.999687

INFO:root:Epoch[19] Batch [200-300]     Speed: 6887.14 samples/sec       accuracy=0.999531

INFO:root:Epoch[19] Batch [300-400]     Speed: 6831.40 samples/sec       accuracy=0.999531

INFO:root:Epoch[19] Batch [400-500]     Speed: 7061.26 samples/sec       accuracy=0.999687

INFO:root:Epoch[19] Batch [500-600]     Speed: 7635.73 samples/sec       accuracy=0.999531

INFO:root:Epoch[19] Batch [600-700]     Speed: 7629.15 samples/sec       accuracy=0.999687

INFO:root:Epoch[19] Batch [700-800]     Speed: 7766.13 samples/sec       accuracy=0.999844

INFO:root:Epoch[19] Batch [800-900]     Speed: 7605.55 samples/sec       accuracy=1.000000

INFO:root:Epoch[19] Train-accuracy=0.999733

INFO:root:Epoch[19] Time cost=8.359

INFO:root:Epoch[19] Validation-accuracy=0.982882

jetbot@jetbot:~/mxnet/example/image-classification$