私は、基本的なAndroidのTensorFlowInference
の例を1つのスレッドで正常に実行しています。マルチコアデバイスでTensorFlowを実行する
public class InferenceExample {
private static final String MODEL_FILE = "file:///android_asset/model.pb";
private static final String INPUT_NODE = "intput_node0";
private static final String OUTPUT_NODE = "output_node0";
private static final int[] INPUT_SIZE = {1, 8000, 1};
public static final int CHUNK_SIZE = 8000;
public static final int STRIDE = 4;
private static final int NUM_OUTPUT_STATES = 5;
private static TensorFlowInferenceInterface inferenceInterface;
public InferenceExample(final Context context) {
inferenceInterface = new TensorFlowInferenceInterface(context.getAssets(), MODEL_FILE);
}
public float[] run(float[] data) {
float[] res = new float[CHUNK_SIZE/STRIDE * NUM_OUTPUT_STATES];
inferenceInterface.feed(INPUT_NODE, data, INPUT_SIZE[0], INPUT_SIZE[1], INPUT_SIZE[2]);
inferenceInterface.run(new String[]{OUTPUT_NODE});
inferenceInterface.fetch(OUTPUT_NODE, res);
return res;
}
}
以下の例のようThreadPool
で実行しているときの例では、ので、私はそれがスレッドセーフではありませんだと思いますjava.lang.ArrayIndexOutOfBoundsException
とjava.lang.NullPointerException
含む様々な例外を除いてクラッシュします。
InferenceExample inference = new InferenceExample(context);
ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_CORES);
Collection<Future<?>> futures = new LinkedList<Future<?>>();
for (int i = 1; i <= 100; i++) {
Future<?> result = executor.submit(new Runnable() {
public void run() {
inference.call(randomData);
}
});
futures.add(result);
}
for (Future<?> future:futures) {
try { future.get(); }
catch(ExecutionException | InterruptedException e) {
Log.e("TF", e.getMessage());
}
}
それはTensorFlowInferenceInterface
でマルチコアAndroidデバイスを活用することは可能ですか?
このアプローチには強くお勧めします。もちろん、 'run'の呼び出しを同時に行うことができるようにしましたが、' TensorFlowInferenceface.feed() 'を呼び出して)入力を変更しないと意味がありません。 おそらく、スレッドが異なる入力をフィードして計算を実行できるようにしたいとします。そして、あなたが提案したアプローチはそれにとって安全ではありません。 – ash
異なる入力にはなぜ安全でないのですか?ループの中で先物を 'id'の順番で格納するというマイナーな変更で、どの入力がどの出力と一致するかを知ることができます。 –
ああ、申し訳ありませんが、私は誤解して、 'feed()'と 'fetch()'の呼び出しがあなたの同期 'run()'の中にあることに気付かなかった。だから、私は上記の私のコメントで間違っていた。 しかし、このアプローチでは、本質的にTensorFlowセッションの使用をシリアル化するため、並列性が制限されます。一度に1つのスレッドしかモデルを実行できません。 – ash