【TF2】Bazelビルド bfloat16.cc(635): error C2664 / ‘PyUFuncGenericFunction’ へ変換できません

TIPS ディープラーニング
スポンサーリンク

半日ほどハマってましたが、
解決しましたのでメモとして残しておきます。

調査日:2020年7月11日

現象

TF2.2が出たので、
Windows10+VS2019で、ソースコードからTensorFlow2.2を新規ビルドした時の話。
ビルドの最後の方で該当のエラーが発生。

”–define=no_tensorflow_py_deps=true” のオプションは付けていたので、
それ関係のエラーではなさそうです。

bazel build --define=no_tensorflow_py_deps=true --config=opt //tensorflow/tools/pip_package:build_pip_package

エラーメッセージ

tensorflow/python/lib/core/bfloat16.cc(643): error C2664:
「’PyUFuncGenericFunction’ へ変換できません。」
が特徴的なメッセージです。

tensorflow/python/lib/core/bfloat16.cc(635): error C2664: 'bool tensorflow::`anonymous-namespace'::Initialize::<lambda_02b7287176caec052fc5413410f17d41>::operator ()(const char *,PyUFuncGenericFunction,const std::array<int,3> &) const': 引 数 2 を 'void (__cdecl *)(char **,npy_intp *,npy_intp *,void *)' から 'PyUFuncGenericFunction' へ変換できません。
tensorflow/python/lib/core/bfloat16.cc(635): note: スコープ内でこの名前を指定された関数でターゲット型に一致するものはあ りません。
tensorflow/python/lib/core/bfloat16.cc(636): note: 'operator __surrogate_func' の宣言を確認してください
tensorflow/python/lib/core/bfloat16.cc(639): error C2664: 'bool tensorflow::`anonymous-namespace'::Initialize::<lambda_02b7287176caec052fc5413410f17d41>::operator ()(const char *,PyUFuncGenericFunction,const std::array<int,3> &) const': 引 数 2 を 'void (__cdecl *)(char **,npy_intp *,npy_intp *,void *)' から 'PyUFuncGenericFunction' へ変換できません。
tensorflow/python/lib/core/bfloat16.cc(639): note: スコープ内でこの名前を指定された関数でターゲット型に一致するものはあ りません。
tensorflow/python/lib/core/bfloat16.cc(640): note: 'operator __surrogate_func' の宣言を確認してください
tensorflow/python/lib/core/bfloat16.cc(643): error C2664: 'bool tensorflow::`anonymous-namespace'::Initialize::<lambda_02b7287176caec052fc5413410f17d41>::operator ()(const char *,PyUFuncGenericFunction,const std::array<int,3> &) const': 引 数 2 を 'void (__cdecl *)(char **,npy_intp *,npy_intp *,void *)' から 'PyUFuncGenericFunction' へ変換できません。
tensorflow/python/lib/core/bfloat16.cc(643): note: スコープ内でこの名前を指定された関数でターゲット型に一致するものはあ りません。
tensorflow/python/lib/core/bfloat16.cc(643): note: 'operator __surrogate_func' の宣言を確認してください
tensorflow/python/lib/core/bfloat16.cc(646): error C2664: 'bool tensorflow::`anonymous-namespace'::Initialize::<lambda_02b7287176caec052fc5413410f17d41>::operator ()(const char *,PyUFuncGenericFunction,const std::array<int,3> &) const': 引 数 2 を 'void (__cdecl *)(char **,npy_intp *,npy_intp *,void *)' から 'PyUFuncGenericFunction' へ変換できません。
tensorflow/python/lib/core/bfloat16.cc(646): note: スコープ内でこの名前を指定された関数でターゲット型に一致するものはあ りません。
tensorflow/python/lib/core/bfloat16.cc(647): note: 'operator __surrogate_func' の宣言を確認してください
tensorflow/python/lib/core/bfloat16.cc(650): error C2664: 'bool tensorflow::`anonymous-namespace'::Initialize::<lambda_02b7287176caec052fc5413410f17d41>::operator ()(const char *,PyUFuncGenericFunction,const std::array<int,3> &) const': 引 数 2 を 'void (__cdecl *)(char **,npy_intp *,npy_intp *,void *)' から 'PyUFuncGenericFunction' へ変換できません。
tensorflow/python/lib/core/bfloat16.cc(650): note: スコープ内でこの名前を指定された関数でターゲット型に一致するものはあ りません。
tensorflow/python/lib/core/bfloat16.cc(651): note: 'operator __surrogate_func' の宣言を確認してください
tensorflow/python/lib/core/bfloat16.cc(654): error C2664: 'bool tensorflow::`anonymous-namespace'::Initialize::<lambda_02b7287176caec052fc5413410f17d41>::operator ()(const char *,PyUFuncGenericFunction,const std::array<int,3> &) const': 引 数 2 を 'void (__cdecl *)(char **,npy_intp *,npy_intp *,void *)' から 'PyUFuncGenericFunction' へ変換できません。
tensorflow/python/lib/core/bfloat16.cc(654): note: スコープ内でこの名前を指定された関数でターゲット型に一致するものはあ りません。
tensorflow/python/lib/core/bfloat16.cc(655): note: 'operator __surrogate_func' の宣言を確認してください
Target //tensorflow/tools/pip_package:build_pip_package failed to build

 

解決手段

公式のissuesに乗っていました。

C++ compilation of rule '//tensorflow/python:bfloat16_lib' failed · Issue #40688 · tensorflow/tensorflow
System information OS Platform and Distribution: Linux Ubuntu 18.04 -- building inside Dockerfile with FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04 TensorFlow...

 

どうやらnumpy1.19に入った変更が引き起こしているらしく、
今のところ解決手段は、

「とりあえず numpyを1.19より前のものにダウングレードせよ」
との事です。

$ pip install numpy==1.18

あるいは

$ pip install "numpy<1.19"

など。

ただ、bazelの差分ビルドで同じエラーになったので、
結局 bazel clean した後、
bazel build することでリビルドかけました。
(約1時間かかりましたが、確実だと思います)

 

この変更後、無事ビルド成功しています。

INFO: Build completed successfully, 10223 total actions

 

なお色々な人が同様の症状で困っていたようで。
Ubuntuや、TF1系でも起こるらしいです。numpy起因ですからねぇ。。。

 

 

調査時の検索キーワード

どういう検索キーワードでたどり着いたか、参考までに

“‘PyUFuncGenericFunction’ へ変換できません” で検索
→ 有用な情報無し

“PyUFuncGenericFunction tensorflow” で検索
“tensorflow/python/lib/core/bfloat16.cc(635): error C2664:” で検索
→ いずれも公式issuesが引っかかる
ちなみに差分ビルドで解決せず。リビルドで解決

 

お役に立てれば幸いでございます。
そいではまたー

 

最後まで読んでいただき、ありがとうございます!

ブックマーク登録、
ツイッターフォロー、
よろしくお願いいたします!🙇‍♂️🙇‍♂️