Word Mover's Distance(3)fastWMD のビルド(後編)

Word Mover's Distance (2) Building fastWMD (Part 2)


2021/05/06
藤田昭人


前回 に引き続き fastWMD のビルドのサクッとした説明を続けます。

とりあえず Github の fastWMD のページを再掲しておきましょう。

github.com


build-project.shを実行する

前回の手順で Google OR-ToolsEigen3 はインストール済みであれば、あと1箇所修正すれば build-project.sh を実行できます。

CMakeLists.txt を修正する

修正が必要なのは CMakeLists.txt で、 コンパイル時のヘッダーファイルのパスに /usr/local/include/eigen3 を追加してやります。 次に fastWMD の CMakeLists.txt を示します。

cmake_minimum_required(VERSION 3.5)
project(fast_wmd)

set(CMAKE_CXX_STANDARD 11)

add_executable(fast_wmd src/main.cpp src/Tools.cpp src/Tools.hpp src/Clustering.cpp src/Clustering.hpp src/Distances.cpp src/Distances.hpp)

# Add ortools
find_library(ORTOOLS_LIB ortools)
target_link_libraries(fast_wmd "${ORTOOLS_LIB}")

# Enable parallelization
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")

# Disable vectorize for fair comparison between distance methods
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-tree-vectorize -DEIGEN_DONT_VECTORIZE=1")

# Add optimization parameter
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")

見てのとおり非常に短いファイルです。 cmake を使ったことのない方には記法の違いに面食らうかもしれませんが、 よく見れば Makefile と同じ考え方で修正すれば良いようです。 ここでは fastWMD が無事コンパイルできるように 前述のヘッダーファイルのパスを追加する修正を示します。

$ diff -u CMakeLists.txt.orig CMakeLists.txt
--- CMakeLists.txt.orig 2020-07-23 09:10:25.000000000 +0900
+++ CMakeLists.txt  2021-05-04 18:02:12.000000000 +0900
@@ -16,4 +16,7 @@
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-tree-vectorize -DEIGEN_DONT_VECTORIZE=1")

 # Add optimization parameter
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
\ No newline at end of file
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
+
+# Add local include for eigen3
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")

見てもらえばわかるように、コンパイル時のフラグを定義するマクロ CMAKE_CXX_FLAGS に '-I/usr/local/include' を追加してるだけです。

fastWMD のビルド

これで build-project.sh が正常に実行できるようになりました。 ビルドのログを次に示します。

$ sh -x build-project.sh
+ mkdir build
+ cd build
+ cmake ..
-- The C compiler identification is AppleClang 12.0.5.12050022
-- The CXX compiler identification is AppleClang 12.0.5.12050022
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/fujita/xtr/BookBot/WMD/WMD-3/fastWMD/build
+ make
[ 20%] Building CXX object CMakeFiles/fast_wmd.dir/src/main.cpp.o
[ 40%] Building CXX object CMakeFiles/fast_wmd.dir/src/Tools.cpp.o
[ 60%] Building CXX object CMakeFiles/fast_wmd.dir/src/Clustering.cpp.o
[ 80%] Building CXX object CMakeFiles/fast_wmd.dir/src/Distances.cpp.o
[100%] Linking CXX executable fast_wmd
[100%] Built target fast_wmd
+ cd ..
$ 

ビルド用の build ディレクトリを作成して、移動し、cmake を実行しています。 これで build ディレクトリ以下にコンパイル用の Makefile が生成されます。 あとは make を実行するだけ。無事 fast_wmd コマンドが生成されました。


kusner コマンドと triplets コマンドを作ってみる

前回も説明しましたが、fast_wmd コマンドは論文 "Speeding up Word Mover’s Distance and its variants via properties of distances between embeddings" の評価パートを書くために、用意されたデータに 文書間距離を計算するさまざまアルゴリズムを一括で適用して、 実行時間とエラーレートだけを表示するバッチ型のプログラムです。

アルゴリズム自体は Distance.cpp/Distance.hpp に実装されていて、 それを呼び出す独自のプログラムをいろいろ作りたいわけですが、 そのためのビルド環境は流用したいところ。 そこで試しに fast_wmd コマンドを2種類の評価実験の 各々に対応する kusner コマンドと triplets コマンドを 作成してみました。両コマンドのソースコード kusner.cpp, triplets.cpp を 含むビルドツリーは Github の次のページにアップしました。

github.com

ここでは CMakeLists.txt の修正点だけ示します。 add_executable と target_link_libraries を追加すると kusner コマンドと triplets コマンドがビルドされるようになります。

$ diff -u ../../fast-wmd/fast-wmd-master/CMakeLists.txt CMakeLists.txt
--- ../../fast-wmd/fast-wmd-master/CMakeLists.txt   2021-05-04 18:02:12.000000000 +0900
+++ CMakeLists.txt  2021-05-05 13:35:15.000000000 +0900
@@ -5,15 +5,22 @@

 add_executable(fast_wmd src/main.cpp src/Tools.cpp src/Tools.hpp src/Clustering.cpp src/Clustering.hpp src/Distances.cpp src/Distances.hpp)

+add_executable(kusner src/kusner.cpp src/Tools.cpp src/Tools.hpp src/Clustering.cpp src/Clustering.hpp src/Distances.cpp src/Distances.hpp)
+
+add_executable(triplets src/triplets.cpp src/Tools.cpp src/Tools.hpp src/Clustering.cpp src/Clustering.hpp src/Distances.cpp src/Distances.hpp)
+
 # Add ortools
 find_library(ORTOOLS_LIB ortools)
 target_link_libraries(fast_wmd "${ORTOOLS_LIB}")
+target_link_libraries(kusner "${ORTOOLS_LIB}")
+target_link_libraries(triplets "${ORTOOLS_LIB}")

 # Enable parallelization
 # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")

 # Disable vectorize for fair comparison between distance methods
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-tree-vectorize -DEIGEN_DONT_VECTORIZE=1")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-writable-strings")

 # Add optimization parameter
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")


まとめ

本稿では CMakeLists.txt の修正法のトピックを 中心に fastWMD のビルド方法について紹介しました。

かつて、X Window System の imake や GNU の autoconf や automake のお世話になっていた 僕のようなオールドユーザーにとって cmake は、 マニュアル を眺めていると多機能ぶりに「ちょっと面食らう」ツールですが、 「基本は Makefile機械的に生成してくれるコマンド」 と理解すると、少し取っ付きやすく感じます。

次回は、せっかく作った triplets コマンドを使って、 もう少し WMD に踏み込んだトピックを紹介したいと考えてます。

以上

f:id:Akito_Fujita:20210503123933p:plain