Pycharmでtensorflow-gpuをWindows 10 pro 1803に新規インストール

tensorflowのGPU版をWindows 10 pro 1803に入れたのでメモ

Cuda9を公式からダウンロードして入れる

インストールおわったら

cudnn-9.0-windows10-x64-v7.1っていうCuDNNをインストールしたCudaに追加
場所は

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0

です

Anaconda3-5.2.0-Windows-x86_64を新規インストール

Pycharmも最新版をインストール

Pycharmを起動したら新規プロジェクトに
Project interpreter:New Virtualenv environment
を開いて
New environment using に Virtualenvを選択して
Base interpreterにさっきインストールした Anaconda3を選択

pycharmのterminalで

pip3 install –upgrade tensorflow-gpu

を実行

これで出来るはず

多量リクエスト(insert)時に10.1.21-MariaDBでmysql-connector-java-5.1.42-bin.jarでJDBCしたときに全然insertが追いつかない(更新されない)問題

なんかMariaDBでmysql-connector-java-5.1.42-bin.jarでJDBCするときにコネクションを貼りまくって、executeUpdateでいっぱい更新しようとしたとき、なんかMariaDBがもういいっぱいだよ~(dirty page だよ~)みたいな感じでぜんぜんSQLのInsertができなくなった

最初はMariaDBの問題かと思って色々チューニングしたりしたけど、解決せず

原因はJDBCのexecuteUpdateでした

これ1秒に100リクエストとかめっちゃ送るときにいちいちコネクション貼り直したりする感じで効率が悪いっぽい

めっちゃいっぱい更新したいときは

executeBatch

を使いましょう

そうしたら恐ろしいほどクエリが改善した。

ついでにいうとBulk insertにするとより早いとおもう!

 

public void doSQL(String sql) {
start();
try {
stmt.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

 

から

 

}
public void doSQLBig(String sql) {
start();
try {
//conn.setAutoCommit(false);
stmt.addBatch(sql);
int result[]=stmt.executeBatch();

for(int i=0;i<result.length;i++){
System.out.println(“result”+i+”: “+result[i]);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

に変更した

出てたエラー↓

at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1552)
at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2607)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1480)
at com.coin.java.web.SQL.doSQL(SQL.java:198)
at com.coin.java.web.CommonApi.insertBalanceSQL(CommonApi.java:3256)
at com.coin.java.web.RateCallback.getBalance(RateCallback.java:479)
… 1 more
Caused by: java.net.SocketException: Unrecognized Windows Sockets error: 0: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:101)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:144)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:174)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3008)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3469)
… 12 more
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.GeneratedConstructorAccessor61.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1187)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1182)
at com.mysql.jdbc.ConnectionImpl.createStatement(ConnectionImpl.java:2377)
at com.mysql.jdbc.ConnectionImpl.createStatement(ConnectionImpl.java:2361)
at com.coin.java.web.SQL.start(SQL.java:81)
at com.coin.java.web.SQL.doSQL(SQL.java:196)
at com.coin.java.web.CommonApi.insertBalanceSQL(CommonApi.java:3256)
at com.coin.java.web.RateCallback.getBalance(RateCallback.java:482)
at com.coin.java.web.RateCallback$4.run(RateCallback.java:166)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 22,566 milliseconds ago. The last packet sent successfully to the server was 22,566 milliseconds ago.
at sun.reflect.GeneratedConstructorAccessor60.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3559)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3459)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3900)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1552)
at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2607)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1480)
at com.coin.java.web.SQL.doSQL(SQL.java:198)
at com.coin.java.web.CommonApi.insertBalanceSQL(CommonApi.java:3256)
at com.coin.java.web.RateCallback.getBalance(RateCallback.java:479)
… 1 more

 

 

 

FirefoxのseleniumでnameとIDのelementを取得

答えから
//タグ名=”form”を検索
driver.findElement(By.cssSelector(“form”)).click();
//クラス名=”login”を検索
driver.findElement(By.cssSelector(“.login”)).click();
//id名=”form”を検索
driver.findElement(By.cssSelector(“#testForm”)).click();
//タグ名=”input”、クラス名=”login”を検索
driver.findElement(By.cssSelector(“input.login”)).click();
//タグ名=”form”、id名=”testForm”を検索
driver.findElement(By.cssSelector(“form#testForm”)).click();

 

終わり!
 

java.lang.OutOfMemoryErrorの対処法

java.lang.OutOfMemoryErrorは出ないけど、GCが頻発しまくるのでメモリの調整をしてみた

Tomcat の起動パラメータ設定
Eclipse のTomcat プラグイン設定
ウインドウ > 設定 > Tomcat > JVM 設定 > JVM パラメータへ追加

以下のパラメータを設定する。

-XX:MaxPermSize=256m
-Xmx1024m
-Xms256m
RAMの容量を考慮して、適宜メモリを割り当てる。

PubNub java でPNBadRequestCategory

pubnub-gson-4.19.0-all.jarでWebsocket的な高速のデータ取得(subscription)をやろうとした

subscriptionだけならPublishKeyはなくても良いとのこと

テストコード

PNConfiguration pnConfiguration = new PNConfiguration();
//pnConfiguration.setLogVerbosity(PNLogVerbosity.BODY);

pnConfiguration.setSubscribeKey(“sub-c-e12e9174-dd60-11e6-806b-02ee2ddab7fe”);
//pnConfiguration.setPublishKey(“demo”);

pnConfiguration.setReconnectionPolicy(PNReconnectionPolicy.LINEAR);
//pnConfiguration.setSecure(false);

PubNub pubnub = new PubNub(pnConfiguration);

 

これでpubnubにchannelをexcuteしたらできる

だけどなぜかError=PNConnectedCategoryで動かない

正しいパターン
statusPNStatus(category=PNConnectedCategory, errorData=null, error=false, statusCode=200, operation=PNSubscribeOperation, tlsEnabled=true, uuid=null, authKey=null, origin=ps.pndsn.com, clientRequest=Request{method=GET, url=https://ps.pndsn.com/v2/subscribe/sub-c-52a9ab50-291b-11e5-baaa-0619f8945a4f/lightning_ticker_BTC_JPY/0?requestid=5fd2956a-3935-4f3d-85f1-da2fb9c9fb0f&heartbeat=300&tt=0&pnsdk=PubNub-Java-Unified/4.19.0&uuid=pn-acc4761e-6587-4195-931b-dff944ddf1cc, tag=null}, affectedChannels=[lightning_ticker_BTC_JPY], affectedChannelGroups=[], executedEndpoint=null)

正しくないパターン
statusPNStatus(category=PNBadRequestCategory, errorData=PNErrorData(information=null, throwable=com.pubnub.api.PubNubException), error=true, statusCode=0, operation=PNSubscribeOperation, tlsEnabled=false, uuid=null, authKey=null, origin=null, clientRequest=null, affectedChannels=[lightning_ticker_BTC_JPY], affectedChannelGroups=[], executedEndpoint=com.pubnub.api.endpoints.pubsub.Subscribe@65a58842)

別環境では動いたからライブラリが干渉してたっぽい

具体的にはgson-2.3.1.jarをはずすと動いた。

If you catch the error “PNBadRequestCategory” in pubnub-gson-4.19.0-all.jar  , just remove gson library (gson-2.3.1.jar etc…)

ってことだ

 

ubuntu16.0.4でGeforceでCUDAでcnDNN

今流行のディープラーニングを本格的にやってみようと思ったら色々ハマったのでメモ

環境:GeForce GTX 1080 Ti
OS:ubuntu16.0.4

自分の環境だと最新版が動かなかったので古いCUDA8をいれた

前準備
sudo apt update
sudo apt upgrade

ubuntu-16.04.3-server-amd64.iso
をダウンロードして
rufus-2.18でUSBメモリにISOをいれてインストール

このときせっかくだからキーボードの確認無しで自動的にOSをインストールするPRESEEDをしようとしたけど、成功しなかったから面倒くさくなってあきらめた。
(ちなみにCentOSだったらKickstartっていう)

Command Lineが出てきたら以下実行

CUDAインストール
wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb

sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb
sudo apt update

sudo apt install cuda cuda-drivers
sudo reboot

ファイルパスを通す

export PATH=”/usr/local/cuda/bin:$PATH”
export LD_LIBRARY_PATH=”/usr/local/cuda/lib64:$LD_LIBRARY_PATH”

この後nvidia-smiで確認すると成功してたら↓みたいなのがでてくる
+—————————————————————————–+
| NVIDIA-SMI 384.90 Driver Version: 384.90 |
|——————————-+———————-+———————-+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 108… On | 00000000:02:00.0 Off | N/A |
| 91% 81C P2 204W / 220W | 812MiB / 11170MiB | 99% Default |
+——————————-+———————-+———————-+

消費ワット下げることもできる
sudo nvidia-smi -pl 240

※persistence-modeを有効じゃないと出来ないっぽい
sudo nvidia-smi -i 0 -pm ENABLED

deb削除する場合
rm cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb

cuDNNのインストール
https://developer.nvidia.com/rdp/cudnn-download
からcuDNN 6 for CUDA 8.0のdebパッケージをダウンロード
# Install Runtime library
sudo dpkg -i libcudnn6_6.0*+cuda8.0_amd64.deb
# Install developer library
sudo dpkg -i libcudnn6-dev_6.0*+cuda8.0_amd64.deb
# Install code samples and user guide
sudo dpkg -i libcudnn6-doc_6.0*+cuda8.0_amd64.deb

cuDNNの動作確認
cuda-install-samples-8.0.sh ~
cd ~/NVIDIA_CUDA-8.0_Samples/
make
cd bin/x86_64/linux/release
./smokeParticles

これでいけるはず

おまけ
CCminerもインストールしてみた

sudo apt-get install automake libssl-dev libcurl4-nss-dev
wget https://github.com/Nanashi-Meiyo-Meijin/ccminer/archive/v2.2-mod-r2.tar.gz
tar zxvf v2.2-mod-r2.tar.gz
cd ccminer-2.2-mod-r2

bash autogen.sh
./configure
make

OANDAのFIXprotocolでレートを取得

色々あってドル円とかのレートデータを高速で取得する必要があった。
調べたところThe Financial Information eXchange (FIX) protocolがなんか良い感じでスタンダードらしいからそれで構築することにした。

使用したものはQuickFIX/J

http://www.quickfixj.org/

です

YJFXのFIXプロトコルはそこそこ素直に出来たけどOANDAはかなり悩んだ。

ハマったポイントはレートサーバーは別です!
//settings.setString(“SocketConnectHost”, “fxgame-fix.oanda.com”);
settings.setString(“SocketConnectHost”, “fxtrade-fix.oanda.com”);

だけじゃだめ

if(rateServer)settings.setString(“TargetSubID”, “RATES”);

これがいる

これあるとレートサーバーに繋いでくれます。そうじゃないと

toApp :8=FIX.4.49=12735=V34=249=USERID52=20171104-11:48:06.69256=OANDA262=foo263=1264=1265=1266=Y146=155=USD/JPY267=2269=0269=110=207

fromApp :8=FIX.4.49=10835=j34=349=OANDA52=20171104-11:48:05.33056=pp35260445=258=MsgType <35> = V not supported.372=V380=310=180

って怒られます。

正しいリクエスト↓

toApp :8=FIX.4.49=13635=V34=249=USERID52=20171104-11:54:35.94856=OANDA57=RATES262=foo263=1264=1265=1266=Y146=155=USD/JPY267=2269=0269=110=251

んですべてのリクエストに毎回「57=RATES」を入れないとダメです

@Override
public void toAdmin(Message msg, SessionID sessionID) {

try {
String msgType = msg.getHeader().getString(MsgType.FIELD);
if(settings.isSetting(“TargetSubID”))
try {
msg.setString(quickfix.field.TargetSubID.FIELD,
settings.getString(sessionID, “TargetSubID”));
} catch (ConfigError | FieldConvertError e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(MsgType.LOGON.compareTo(msgType) == 0)
{

try {
if(settings.isSetting(“Password”))msg.setString(quickfix.field.Password.FIELD,
settings.getString(sessionID, “Password”));
msg.setString(quickfix.field.ResetSeqNumFlag.FIELD,
“Y”);

} catch (ConfigError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FieldConvertError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (FieldNotFound e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

System.out.println(“toAdmin :”+msg.toString());
}
public void toApp(Message msg, SessionID sessionId) throws DoNotSend {
if(settings.isSetting(“TargetSubID”))
try {
msg.setString(quickfix.field.TargetSubID.FIELD,
settings.getString(sessionID, “TargetSubID”));
} catch (ConfigError | FieldConvertError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(“toApp :”+msg.toString());
}

ゴミコードも置いときます。