TWSNMP FC: brain.jsの組み込み GPUの方が遅いのに驚いた
今朝は3時半に猫が起こしてくれました。今日からTWSNMP FCにbrain.js
を組み込むことを察知して早く起こしてくれたのかもしれません。
brain.jsは、JavaScriptでニューラルネットワーク(AIの一種)を実現するものです。一応GPUに対応していると書いてます。TWSNMP FCに組み込むには、
のドキュメントに書いてあるように、
npm install brain.js
のコマンドでインストールできますが、
import * as brain from 'brain.js'
のように使おうとするとエラーになります。Googleさんに聞いて、
import * as brain from 'brain.js/src/index'
とするとエラーがなくなることがわかりました。理由はわかりませんが、おまじないだと思っています。本当はちゃんと調べたほうがよいかもしれません。
TWSNMP FCのポーリングやログをAIで分析するという本来の目的を作る前にサンプルプログラムをnuxt+vuetifyの環境で動かしてCPUとGPUの動作を可視化してみることにしました。作ったテストプログラムは、
const testBrain = (divError, divModel) => {
makeErrorChart(divError)
console.log('start')
const netCPU = new brain.NeuralNetwork()
const netGPU = new brain.NeuralNetworkGPU()
const xorTrainingData = [
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] },
]
const dataGPU = []
const dataCPU = []
netCPU.train(xorTrainingData, {
callback: (p) => {
const t = new Date()
dataCPU.push({
name: echarts.time.format(t, '{yyyy}/{MM}/{dd} {HH}:{mm}:{ss}'),
value: [t, p.error],
})
console.log(p)
},
})
netGPU.train(xorTrainingData, {
callback: (p) => {
const t = new Date()
dataGPU.push({
name: echarts.time.format(t, '{yyyy}/{MM}/{dd} {HH}:{mm}:{ss}'),
value: [t, p.error],
})
console.log(p)
},
})
chart.setOption({
series: [
{
data: dataCPU,
},
{
data: dataGPU,
},
],
})
console.log(netCPU.run([0, 0]))
console.log(netGPU.run([0, 1]))
const model = document.getElementById(divModel)
if (model) {
model.innerHTML = brain.utilities.toSVG(netGPU)
}
}
です。XORのデータを同じ条件で学習させて学習状況をグラフに書いてみました。
なんと赤い線のGPUのほうが遅いという結果になりました。理由はわかりませんが、まだbrain.jsをGPUモードで使うのはやめておいたほうがよさそうです。
とりあえず、brain.jsが使えるようになったので、
・復刻版でTensorflow.jsを使って作った異常検知のAIを移植する
・LSTMを使って異常検知のAIを作る
・LSTMを使ってsyslogの分類を助けてくれるAIを作る
という目標で開発しようと思っています。
今朝は、ここまで、明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。