🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

8909閲覧

numpy(行列計算)高速化のためのnumbaの型指定について

kimtakuya_

総合スコア22

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/10/26 10:24

編集2019/10/26 10:28

前提・実現したいこと

numbaを用いて行列計算を高速にしたいと考えています。
numba.jitにおいて型指定を行うとより早くなるそうなので試しています。

発生している問題・エラーメッセージ

型推定に失敗?しているようです。

Compilation is falling back to object mode WITH looplifting enabled because Function "compute" failed type inference due to: Invalid use of Function(<built-in function zeros>) with argument(s) of type(s): ((Literal[int](10), array(float64, 1d, A)), dtype=Literal[str](f8)) * parameterized In definition 0: All templates rejected with literals. In definition 1: All templates rejected without literals. This error is usually caused by passing an argument of a type that is unsupported by the named function. [1] During: resolving callee type: Function(<built-in function zeros>) [2] During: typing of call at <ipython-input-45-5c375a54c6a4> (6) File "<ipython-input-45-5c375a54c6a4>", line 6: def compute(T): <source elided> dt = 0.001 X = np.zeros((N,T),dtype='f8') ^ @numba.jit('f8(f8[:])') <ipython-input-45-5c375a54c6a4>:3: NumbaWarning: Compilation is falling back to object mode WITHOUT looplifting enabled because Function "compute" failed type inference due to: cannot determine Numba type of <class 'numba.dispatcher.LiftedLoop'> File "<ipython-input-45-5c375a54c6a4>", line 12: def compute(T): <source elided> for t in range(0,T-1,1): ^ @numba.jit('f8(f8[:])') C:\Users\takuy\Anaconda3\envs\keras_env\lib\site-packages\numba\object_mode_passes.py:178: NumbaWarning: Function "compute" was compiled in object mode without forceobj=True, but has lifted loops. File "<ipython-input-45-5c375a54c6a4>", line 4: @numba.jit('f8(f8[:])') def compute(T): ^ state.func_ir.loc)) C:\Users\takuy\Anaconda3\envs\keras_env\lib\site-packages\numba\object_mode_passes.py:187: NumbaDeprecationWarning: Fall-back from the nopython compilation path to the object mode compilation path has been detected, this is deprecated behaviour. For more information visit http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit File "<ipython-input-45-5c375a54c6a4>", line 4: @numba.jit('f8(f8[:])') def compute(T): ^ warnings.warn(errors.NumbaDeprecationWarning(msg, state.func_ir.loc)) <ipython-input-45-5c375a54c6a4>:16: NumbaPerformanceWarning: '@' is faster on contiguous arrays, called on (array(float64, 2d, C), array(float64, 1d, A)) X_2[:,t+1] = -M_inv@K@X[:,t+1]

該当のソースコード

python

1 2import numpy as np 3from scipy import linalg 4 5m=1 6g=9.8 7k=100 8N=10 9 10#剛性マトリックスの作成 11K=np.eye(N,dtype=float)*2-np.eye(N,k=1)-np.eye(N,k=-1) 12K[0,0]=2;K[N-1,N-1]=1 13M=np.eye(N,dtype=float) 14K_inv=np.linalg.inv(K) 15M_inv=np.linalg.inv(M) 16 17 18import numba 19 20#問題の部分 21@numba.jit('f8(f8[:])') 22def compute(T): 23 dt = 0.001 24 X = np.zeros((N,T),dtype='f8') 25 V = np.zeros((N,T),dtype='f8') 26 V[-1,0] = 1.0 27 X_2 = np.zeros((N,T),dtype='f8') 28 print(V) 29 30 for t in range(0,T-1,1): 31 32 X[:,t+1] = X[:,t] + dt*V[:,t] 33 V[:,t+1] = V[:,t] + dt*X_2[:,t] 34 X_2[:,t+1] = -M_inv@K@X[:,t+1] 35 36 37 return (X) 38 39%time X_=compute(int(1e4)) 40 41 42

試したこと

すべてのarrayををfloat64に型指定しましたが,推定に失敗するようです

補足情報(FW/ツールのバージョンなど)

jupyter notebook 使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

全部を説明できるほど私も完全には理解していないため端的に書きます。

いくつかWarningが出ていますが、最初のはnp.zeros()の引数が原因です。
numbaはnumpyの関数を独自実装のコードと置き換えてコンパイルするのですが、numba実装のzerosは文字列でのdtypeを受け付けないようです。(ドキュメントは見つかりませんでしたがWarningからの推測)

参考: https://numba.pydata.org/numba-doc/dev/reference/numpysupported.html

2番目と3番目のWarningは型情報の間違いによるものです。
compute()は実装をみるとintをひとつ引数にとって、float64の2D-arrayを返す関数になっています。
ところが、デコレータで与えている型情報はf8(f8[:])となっており、これはfloat64の1D-arrayを引数にとって、float64のスカラを返す関数という意味になります。
そのためコンパイラが混乱しているようです。
正しくはf8[:,:](i8)になるのではないでしょうか。

その次のWarningはDeprecationWarningで、上記の原因でコンパイラがnopythonモード(はやい)でのコンパイルに失敗して、objectモード(はやくない)でのコンパイルに切り替えているのですが、この、nopythonモードでのコンパイルに失敗した場合にobjectモードに切り替わる機能が将来的にはなくなりますよという警告です。

一番最後のはパフォーマンスに関する警告で@演算子は連続領域に対する演算のほうが高速ですということを教えてくれているのですが、とりあえず今回は無視するしかなさそうです。

下記にすれば、一番最後のWarning以外は消すことができます。

python

1@numba.jit('f8[:,:](i8)') 2def compute(T): 3 dt = 0.001 4 X = np.zeros((N,T),dtype=np.float64) 5 V = np.zeros((N,T),dtype=np.float64) 6 V[-1,0] = 1.0 7 X_2 = np.zeros((N,T),dtype=np.float64) 8 print(V) 9 10 for t in range(0,T-1,1): 11 12 X[:,t+1] = X[:,t] + dt*V[:,t] 13 V[:,t+1] = V[:,t] + dt*X_2[:,t] 14 X_2[:,t+1] = -M_inv@K@X[:,t+1] 15 16 17 return (X)

ただし、元のままでもint(1e4)を引数にしての最初の実行で、numbaがいい感じに型を推定してちゃんとコンパイルして動作しているはずです。

投稿2019/10/29 09:36

編集2019/10/29 09:39
bsdfan

総合スコア4794

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問