web-dev-qa-db-fra.com

Comment activer le multithreading avec Caffe?

Je voudrais compiler/configurer Caffe afin que, lorsque j’entraîne avec un réseau de neurones artificiels, la formation soit multithread (CPU uniquement, pas de GPU). Comment activer le multithreading avec Caffe? J'utilise Caffe sur Ubuntu 14.04 LTS x64.

10
Franck Dernoncourt

Une solution consiste à utiliser OpenBLAS au lieu d’ATLAS par défaut. Faire cela, 

  1. Sudo apt-get install -y libopenblas-dev
  2. Avant de compiler Caffe, éditez Makefile.config , remplacez BLAS := atlas par BLAS := open
  3. Après avoir compilé Caffe, si vous exécutez export OPENBLAS_NUM_THREADS=4, Caffe utilisera 4 cœurs.

Si cela vous intéresse, voici un script pour installer Caffe et pycaffe sur un nouvel Ubuntu 14.04 LTS x64 ou Ubuntu 14.10 x64. CPU seulement, multi-threaded Caffe. Cela peut probablement être amélioré, mais c'est assez bien pour moi pour l'instant:

# This script installs Caffe and pycaffe on Ubuntu 14.04 x64 or 14.10 x64. CPU only, multi-threaded Caffe.
# Usage: 
# 0. Set up here how many cores you want to use during the installation:
# By default Caffe will use all these cores.
NUMBER_OF_CORES=4
# 1. Execute this script, e.g. "bash compile_caffe_ubuntu_14.04.sh" (~30 to 60 minutes on a new Ubuntu).
# 2. Open a new Shell (or run "source ~/.bash_profile"). You're done. You can try 
#    running "import caffe" from the Python interpreter to test.

#http://caffe.berkeleyvision.org/install_apt.html : (general install info: http://caffe.berkeleyvision.org/installation.html)
cd
Sudo apt-get update
#Sudo apt-get upgrade -y # If you are OK getting prompted
Sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -y -q -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" # If you are OK with all defaults

Sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev
Sudo apt-get install -y --no-install-recommends libboost-all-dev
Sudo apt-get install -y libatlas-base-dev 
Sudo apt-get install -y python-dev 
Sudo apt-get install -y python-pip git

# For Ubuntu 14.04
Sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler 

# LMDB
# https://github.com/BVLC/caffe/issues/2729: Temporarily broken link to the LMDB repository #2729
#git clone https://gitorious.org/mdb/mdb.git
#cd mdb/libraries/liblmdb
#make && make install 

git clone https://github.com/LMDB/lmdb.git 
cd lmdb/libraries/liblmdb
Sudo make 
Sudo make install

# More pre-requisites 
Sudo apt-get install -y cmake unzip doxygen
Sudo apt-get install -y protobuf-compiler
Sudo apt-get install -y libffi-dev python-dev build-essential
Sudo pip install lmdb
Sudo pip install numpy
Sudo apt-get install -y python-numpy
Sudo apt-get install -y gfortran # required by scipy
Sudo pip install scipy # required by scikit-image
Sudo apt-get install -y python-scipy # in case pip failed
Sudo apt-get install -y python-nose
Sudo pip install scikit-image # to fix https://github.com/BVLC/caffe/issues/50


# Get caffe (http://caffe.berkeleyvision.org/installation.html#compilation)
cd
mkdir caffe
cd caffe
wget https://github.com/BVLC/caffe/archive/master.Zip
unzip -o master.Zip
cd caffe-master

# Prepare Python binding (pycaffe)
cd python
for req in $(cat requirements.txt); do Sudo pip install $req; done
echo "export PYTHONPATH=$(pwd):$PYTHONPATH " >> ~/.bash_profile # to be able to call "import caffe" from Python after reboot
source ~/.bash_profile # Update Shell 
cd ..

# Compile caffe and pycaffe
cp Makefile.config.example Makefile.config
sed -i '8s/.*/CPU_ONLY := 1/' Makefile.config # Line 8: CPU only
Sudo apt-get install -y libopenblas-dev
sed -i '33s/.*/BLAS := open/' Makefile.config # Line 33: to use OpenBLAS
# Note that if one day the Makefile.config changes and these line numbers change, we're screwed
# Maybe it would be best to simply append those changes at the end of Makefile.config 
echo "export OPENBLAS_NUM_THREADS=($NUMBER_OF_CORES)" >> ~/.bash_profile 
mkdir build
cd build
cmake ..
cd ..
make all -j$NUMBER_OF_CORES # 4 is the number of parallel threads for compilation: typically equal to number of physical cores
make pycaffe -j$NUMBER_OF_CORES
make test
make runtest
#make matcaffe
make distribute

# Bonus for other work with pycaffe
Sudo pip install pydot
Sudo apt-get install -y graphviz
Sudo pip install scikit-learn

# At the end, you need to run "source ~/.bash_profile" manually or start a new Shell to be able to do 'python import caffe', 
# because one cannot source in a bash script. (http://stackoverflow.com/questions/16011245/source-files-in-a-bash-script)

J'ai placé ce script sur GitHub: 
https://github.com/Franck-Dernoncourt/caffe_demos/tree/master/caffe_installation

21
Franck Dernoncourt

Ceci est juste pour étendre Franck answer où il a utilisé sed pour modifier le fichier config. Si cela vous pose problème, voici une autre façon de faire la même chose.

La différence est qu'au lieu de changer le fichier de configuration, vous modifiez directement l'indicateur camke. cmake -DCPU_ONLY=1 -DBLAS=open ..

$Sudo apt update && Sudo apt-get install -y libopenblas-dev
$git clone -b 1.0 --depth 1 https://github.com/BVLC/caffe.git . && \
    pip install --upgrade pip && \
    cd python && pip install -r requirements.txt && cd .. && \
    mkdir build && cd build && \
    cmake -DCPU_ONLY=1 -DBLAS=open .. && \
    make -j"$(nproc)"
1
Ultraviolet

Tout en construisant caffe, vous devez ajouter -fopenmp aux CXXFLAGS et LINKFLAGS pour prendre en charge OPENMP. Si vous avez un indicateur nommé OPENMP dans le fichier Makefil.config, vous pouvez simplement le définir sur 1. Vous pouvez utiliser la bibliothèque OPENBLAS ou Intel MKL BLAS. Lors de la construction de OPENBLAS, vous devez définir USE_OPENMP = 1 pour qu’il prenne en charge OPENMP. Après avoir construit caffe, exportez le nombre de threads que vous souhaitez utiliser lors de l'exécution en définissant OMP_NUM_THREADS = n, n étant le nombre de threads souhaités. Voici une bonne discussion liée au multi-threading dans Caffe: https://github.com/BVLC/caffe/pull/439

0
dipendra009