端の知識の備忘録

技術メモになりきれない、なにものか達の供養先

横12ボタン無線マウスの新作 SteelSeriesのAerox9を買ったのでNaga Pro, G600と比較する【FF14】

概要

少し前、SteelSeriesから横12ボタンのMMO用無線マウスが新発売された。前から出ているのは気づいていたのだが、値段が高いしG600もRazer Naga Proも持っているので買わなかった。

akiba-pc.watch.impress.co.jp

今回アマゾンのタイムセール祭りで税込み16000円かつ10パーオフクーポンかつポイントアップが重なって割とお買い得に感じたので、大した必要性はなかったが買ってみた。

軽くコンテンツに行きながら使用感を確かめてみたので、定番のG600, 無線12ボタンマウスの先輩Naga Proと比較レビューしてみる。

まとめ

値段は G600 < 一万円の壁 < Aerox9 <= Naga Pro

  • g600の特徴

  • Naga Proの特徴

    • g600に比較的近い形状で無線
    • サイドパネルの付け替えで2ボタン、6ボタンへの変更が可能
    • クリッキーで軽めのボタン
    • おま環かもしれないが、たまにサイドボタンが効かなくなる不具合がある
  • Aerox9の特徴

    • ボタンの配置が幅広で前寄りに配置されている。私の手のサイズ(日本人男性のほぼ標準のサイズ)だと自然に持った状態では3が押しにくい。G600形状に慣れると押しにくいと思う。
    • ボタンはクリッキーではなく、ほか2つと比較して重めに感じる
    • めちゃくちゃ軽い
      • だが、横ボタンの重さも相まって、押しにくい端の方のボタンを押そうとすると軽すぎる故本体が動いてしまい、扱いに慣れが必要と感じる。
    • 少し使ってみた感じ、サイドボタンが反応しないなどの不具合はない

結局、個人的おすすめはG600。絶対に無線じゃないとダメという人でなければまずはこれを試すと良い。

無線で2機種のどちらを選ぶかだが、両者は大分形状に差があるので、まずはサイドボタンが押しやすい方を選ぶべし。Naga Proは形状的にはG600に近く、Aerox9はボタン配置が長め。 一度量販店で触って違和感ないものを選ぶとよいだろう。

残りの判断材料として、軽さやギミック、充電持ち、ソフトウェア、見た目等々考えながら気に入ったものを買うといいと思う。 ただ、個人的な経験ではNaga Proはサイドボタンを付け替えられるギミックが祟ってか、サイドボタンの挙動が怪しくなることがある。一度交換してもらっても解決しなかったので、ある程度機種の特性として理解するしかないかもしれない。

hashicco.hatenablog.com

まとめると、G600に慣れておりそれの無線版が欲しいとか、色んなゲームで使うためにサイドボタン数変えられるギミックに価値を見出す人はRazer Naga Pro 触ってみてボタン配置が気に入った人や、極限まで軽さを追い求める人はAerox9を買うと良い。

写真

上から並べて見た図。Aerox9の縦のサイズがだいぶ大きい。

横ボタンの比較。お尻を揃えて並べているが、かなりAerox9のサイドボタン位置は前寄りであることがわかる。

持って見た図。3のボタンがかなり前にあるので、正直かなり押しにくい。

使用感

エキルレや6.2極など少しだけAerox9で行ってみたが、やはり私の手のサイズだと3番が押しにくく、それをカバーするために前寄りに持つと今度は10-12番が押しにくい、と根本的にボタン位置が合わない!

非常に軽いので長時間利用で疲れにくいのは大きなメリットであるが、結局サイドボタンの操作が難しいのであれば実用に値しないと言わざるをえない。

Razer Naga Proのようなサイドボタンの不具合は今のところ確認されていないので、手が大きい人にはおすすめできると思う。私はまたFF14用マウスの無線化は諦め、G600使いに戻ることとしました……。

【田舎の回線事情】ピカラの10Gbpsプランはちゃんと実測でマルチギガな速度が出る

概要

私の居住地は現在徳島である。

住んでいる集合住宅の都合上、光回線のプロバイダーはSTNet ピカラという、ここに来るまで聞いたこともなかった元四国電力系のプロバイダーを利用している。元々1Gbpsの契約をしていて速度的に不満はなかったのだが、なんとこの日本の片田舎にもピカラが10Gbpsの提供を開始するというビッグニュースが舞い込んできた。

www.pikara.jp

あまり契約者がいないからか(失礼)、元々数100Mbpsの速度が常時出ていたので10Gbpsの契約をする意味は殆どなかったのだが、せっかくLANにSFP+まで使って10G環境を構築しているのでこれを活かすためにも10Gへの切り替えをしてみた。

hashicco.hatenablog.com

結果、ルーターを変えたりしなければならなかったものの、スピードテスト最大7Gbpsという驚異的な速度が出ることが確認できた。ということで、少なくとも20220903現在私の環境で確認した限りでは、STNetの10Gプランは偽りなしに実測マルチギガビットの速度が出るサービスといえよう。

工事も単に終端装置の変更だけで済み、月額料金も1Gプランに+1500円の月額税込み5390円(集合住宅プラン)と現実的な金額なので、大量にデータをダウンロードする人にはおすすめできそう。徳島でまともな10G回線が契約できるようになるとは思っていなかったので、嬉しい誤算である。

まとめ

  • サービス開始前から予約して、サービスインから大体1ヶ月待ちくらいで工事が来てくれた。工事は終端装置の変更のみ。
    • 終端装置の型番はFTE7653Rというもの。LANポートが2つあるが、おそらくLAN1のみが10G対応のRJ45だと思う。
  • ルーターNTT-Xで少し安かったので、バッファローWXR-6000AX12S/Dに買い替え、スイッチもRJ45とSFP+のコンボポートが必要だったので、QSW-308-1Cを購入。合わせて50000弱の出費。
    • WiFi6Eの足音が聞こえる中で無線ルーターを買い替えるのは少しためらいがあったが、おもったよりもWXR-6000AX12Sが安かったので買ってしまった。
    • 元々YamahaのRTX1300でも買おうかと思っていたのだが、発売日まで我慢できず……。

www.amazon.co.jp

で、回線速度はこんな感じであった。それぞれ面倒なので平均とかは取っていないが、何回か計測しても安定して1G以上の速度が出ることは確認している。レイテンシも概ね10ミリ秒台であった。詳しくは末尾にスクショをのっけているので見てみてほしい。

単位: Mbps

google speedtest
down

up
fast.com
down

up
1G契約時有線 724.4 221.5 790 900
10G契約時有線 2134.1 1783.8 7000 2000
10G契約時無線(Pixel6a) 700.8 660.7 1800 880

ルーターを買い替えた効果もあり、無線でも1Gオーバーを確認。月+1500円は安くはないが、ピカラの10Gプランは必要な人にとっては有用なオプションであることは間違いない。

配線とか

元々はこんな感じでLANの一部だけ10GにしてNASとPCを高速に繋いでいた。

ルーターのNetgear X10はWANが10Gに対応していなかったので、これを10G WANと10G LANを最低1本持ったルーターに買い換える必要がある。

---終端装置---(1G RJ45)
               |--Netgear X10---(10G SFP+)
                          |--MikroTik CRS305-1G-4S+IN---(10G SFP+)
                                                       |---PC (HP NC552SFP)
                                                       |---NAS (TS-332X)

この状態ではSpeedTestの結果も振るわず、1G契約のときと同じく800Mbpsくらいまでしか出なかった。

で、これをルーター: WXR-6000AX12S/D、スイッチ: QSW-308-1Cに変更し、次のように接続

---終端装置---(10G RJ45)
               |---Buffalo WXR-6000AX12S/D---(10G RJ45)
                                |---QNAP QSW-308-1C---(10G SFP+)
                                                       |---PC (HP NC552SFP)
                                                       |---NAS (TS-332X)

こうすることで、LANはもちろん、阿波の地であってもWAN最大10Gの通信ができるようになったとさ。めでたしめでたし。

スクショ

  • 1G契約時の測定結果

  • 10Gの無線(Pixel6a)

AMD/Intel GPUでもTensorFlowを高速化できるTensorFlow-DirectMLがTF2対応したらしい(まだプレビュー)

概要

以前こちらの記事で書いたようにDirectXを介して機械学習系の演算を行うことで、CUDAが使えるnvidiaGPUに限らず、DirectX12に対応するあらゆるGPUにおいて機械学習を高速化できるというmicrosoftDirectMLというプロジェクトがある。(ただし、DirectXを使うことからわかるように、WindowsまたはWSLのみで利用可能であることに注意!)

github.com

このDirectMLを使った実例の一つとして、DirectMLによってTensorFlowを高速化した、tensorflow-directmlというパッケージが存在。TensorFlow 1.15互換で、CUDAのインストールのようなややこしい手順なしに、ただpip install tensorflow-directmlを実行するだけで、nvidia, AMD, Intelなどメーカーに限らずGPUを使ったTensorFlowの高速化が可能という素晴らしいパッケージであった。

github.com

ただ、今更TensorFlowの1.15を使わなければいけないのはしんどい。

TensorFlow-DirectMLのGitHubページではいずれTensorFlow2に対応予定と書いてあったので、RX6900XT持ちでTF2使いの私はそのリリースを今か今かと待ち望んで定期的にウォッチしていたのですが、なんと本日2022/6/23にtensorflow-directml-pluginなるTF2のPluggable DeviceとしてDMLGPUを認識させるプラグインがプレビューながらリリースされたのでした。

github.com

まだ出たばかりで実用に耐えうるものとは思いませんが、とりあえず使ってみたメモを書いてみます。

まとめ

  • DirectML + TensorFlow2の環境構築は、次の2行でサクッとできます(既存環境に影響ないように、必ず仮想環境作ってから実行しましょう)。
    • pip install tensorflow-cpu
    • pip install tensorflow-directml-plugin
  • Requirementは、Windows 10 Version 1709, 64-bit (Build 16299 or higher)、TensorFlow2.9以上、Python3.7以上
  • AMD RX6900XTで試してみたところ、MobileNetの学習がCPU(Ryzen5 5600X, 6core)の10倍近く高速化できることを確認!
  • 残念ながら、まだ非対応の演算も存在する模様。今回試したテストプログラムの中では、tf.keras.layers.preprocessing.RandomFlipのような、Layerを使ったAugmentationでエラーが出てしまった。
    • いずれ修正されるものと願っていますが、今のところはAugmentationをDataloader部分で実装するなどして対応するしかなさそう。

ちなみに、以前の記事でも書きましたが、DirectMLをnvidiaGPUで使うこともでき、CUDAやらインストールしなくてもGPUを使えるようになりますが、パフォーマンス劣化があります(演算の種類にもよりますが通常のCUDAの1/3ほどになってしまう)。

ですので、基本的にはWindowsAMD/Intel GPUを使ってる人のみが対象になるかと思います。

tensorflow-directml-pluginが出るまでの流れをちょっと書いてみる

私がこのDirectML関連の存在を知ったのは最初の記事を書いた2021/1頃なのですが、そこから定期的にTF2対応に関する議論をウォッチしていたので、一応Pluggable DeviceとしてDMLが実装されるまでの情報源を知る限りでメモっておく。なんの役に立つかは知らない。

インストール方法の詳細

公式のドキュメントは一応こちら。BUILD.mdにはソースからのビルド方法もありますが、pypitensorflow-directml-pluginが登録されているのでただ試すだけならこちらを使ったほうが楽。

仮想環境作成&アクティベーション

コマンドプロンプト起動して以下を実行。Anaconda使っている人はそちらでも良い。

python -m venv にんいのなまえ
"仮想環境作った場所までのパス\にんいのなまえ\Scripts\activate.bat"

TensorFlowとtensorflow-directml-pluginのインストール

一応ここに書いてある内容を参考。

pip install tensorflow-cpu
pip install tensorflow-directml-plugin

インストールのチェック

PythonのREPLを起動して、次の2行を実行(参考: https://thr3a.hatenablog.com/entry/20180113/1515820265) 。

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

すると、次のような出力がずらずらと出てくる。DirectMLやらpluggable_deviceやらキーワードっぽいのがたまに紛れてます。

device:GPU:0の項目に、physical_device_desc: "device: 0, name: DML, pci bus id: <undefined>として認識されていることがわかります。

2022-06-23 18:49:20.701865: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-06-23 18:49:20.702369: I tensorflow/c/logging.cc:34] DirectML: creating device on adapter 0 (AMD Radeon RX 6900 XT)
2022-06-23 18:49:20.738276: I tensorflow/c/logging.cc:34] Successfully opened dynamic library Kernel32.dll
2022-06-23 18:49:20.739402: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305] Could not identify NUMA node of platform GPU ID 0, defaulting to 0. Your kernel may not have been built with NUMA support.
2022-06-23 18:49:20.739469: W tensorflow/core/common_runtime/pluggable_device/pluggable_device_bfc_allocator.cc:28] Overriding allow_growth setting because force_memory_growth was requested by the device.
2022-06-23 18:49:20.739734: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271] Created TensorFlow device (/device:GPU:0 with 14636 MB memory) -> physical PluggableDevice (device: 0, name: DML, pci bus id: <undefined>)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 16333154288072444646
xla_global_id: -1
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 15346960384
locality {
  bus_id: 1
}
incarnation: 13616500749135176656
physical_device_desc: "device: 0, name: DML, pci bus id: <undefined>"
xla_global_id: -1
]

性能検証

次の環境で簡単なMobileNetベースの画像分類モデルのトレーニングをCPUで実行したときとDMLGPUを使ったときを比較し、DirectML利用による高速化を検証しました。

  • OS: Windows10 Home(21H2)
  • CPU: Ryzen5 5600X(6C12T)
  • MB: msi mpg B550 gaming plus
  • RAM: 3200MHz 16GBx2
  • GPU: RX6900XT

検証に使ったのはTensorFlowの次のチュートリアルのコードを少し改変したもの。一応末尾に貼っておきます。

www.tensorflow.org

ただ、そのままコードを実行しようとするとData Augmentation の部分でエラーが出てしまったので、そこだけコメントアウトしています。

どうやらrandom_flip内で使われているオペレーションの一部が上手く動かない模様。まだプレビューなので致し方なしか。

tensorflow.python.framework.errors_impl.InvalidArgumentError: Cannot assign a device for operation Func/model/sequential/random_flip/map/while/cond/_0/input/_43: Could not satisfy explicit device specification '/job:localhost/replica:0/task:0/device:GPU:0' because no supported kernel for GPU devices is available.

で、Augmentationだけコメントアウトしてしまえば特に何事もなく動いてくれましたので、1エポックあたりの時間を見てみると、CPUが約43秒に対し、RX6900XT(DirectML)では約4秒と、10倍近い高速化を確認できました

CPU

Epoch 1/10
63/63 [==============================] - 47s 713ms/step - loss: 0.2533 - accuracy: 0.8935 - val_loss: 0.0814 - val_accuracy: 0.9691
Epoch 2/10
63/63 [==============================] - 43s 675ms/step - loss: 0.1681 - accuracy: 0.9320 - val_loss: 0.0541 - val_accuracy: 0.9802
....
Epoch 10/10
63/63 [==============================] - 43s 679ms/step - loss: 0.0794 - accuracy: 0.9690 - val_loss: 0.0448 - val_accuracy: 0.9851

GPU

Epoch 1/10
63/63 [==============================] - 9s 76ms/step - loss: 0.1371 - accuracy: 0.9420 - val_loss: 0.0685 - val_accuracy: 0.9728
Epoch 2/10
63/63 [==============================] - 4s 55ms/step - loss: 0.0429 - accuracy: 0.9830 - val_loss: 0.1365 - val_accuracy: 0.9567
……
Epoch 10/10
63/63 [==============================] - 4s 56ms/step - loss: 0.0171 - accuracy: 0.9940 - val_loss: 0.1299 - val_accuracy: 0.9629

ついでに学習中のタスクマネージャを見てみると、GPU使用率やVRAM使用率が上昇していることが確認できました。

おまけのベンチマークに使用したコード。tf.device()の指定でCPUとGPUを明示的に切り替えています。

# Froked from https://github.com/tensorflow/docs-l10n/blob/master/site/ja/tutorials/images/transfer_learning.ipynb
import os
import tensorflow as tf

from tensorflow.keras.preprocessing import image_dataset_from_directory

_URL = 'https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'
path_to_zip = tf.keras.utils.get_file('cats_and_dogs.zip', origin=_URL, extract=True)
PATH = os.path.join(os.path.dirname(path_to_zip), 'cats_and_dogs_filtered')

train_dir = os.path.join(PATH, 'train')
validation_dir = os.path.join(PATH, 'validation')

BATCH_SIZE = 32
IMG_SIZE = (160, 160)

DEVICE = '/CPU:0'

with tf.device(DEVICE):
  train_dataset = image_dataset_from_directory(train_dir,
                                              shuffle=True,
                                              batch_size=BATCH_SIZE,
                                              image_size=IMG_SIZE)

  validation_dataset = image_dataset_from_directory(validation_dir,
                                                    shuffle=True,
                                                    batch_size=BATCH_SIZE,
                                                    image_size=IMG_SIZE)

  val_batches = tf.data.experimental.cardinality(validation_dataset)
  test_dataset = validation_dataset.take(val_batches // 5)
  validation_dataset = validation_dataset.skip(val_batches // 5)

  AUTOTUNE = tf.data.AUTOTUNE

  train_dataset = train_dataset.prefetch(buffer_size=AUTOTUNE)
  validation_dataset = validation_dataset.prefetch(buffer_size=AUTOTUNE)
  test_dataset = test_dataset.prefetch(buffer_size=AUTOTUNE)

  # data_augmentation = tf.keras.Sequential([
  #   tf.keras.layers.experimental.preprocessing.RandomFlip('horizontal'),
  #   # tf.keras.layers.experimental.preprocessing.RandomRotation(0.2),
  # ])

  preprocess_input = tf.keras.applications.mobilenet_v2.preprocess_input

  # Create the base model from the pre-trained model MobileNet V2
  IMG_SHAPE = IMG_SIZE + (3,)
  base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                                include_top=False,
                                                weights='imagenet')

  image_batch, label_batch = next(iter(train_dataset))
  feature_batch = base_model(image_batch)
  print(feature_batch.shape)

  base_model.trainable = True

  # Let's take a look at the base model architecture
  base_model.summary()

  global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
  feature_batch_average = global_average_layer(feature_batch)
  print(feature_batch_average.shape)

  prediction_layer = tf.keras.layers.Dense(1)
  prediction_batch = prediction_layer(feature_batch_average)
  print(prediction_batch.shape)

  inputs = tf.keras.Input(shape=(160, 160, 3))
  # x = data_augmentation(inputs)
  x = preprocess_input(inputs)
  x = base_model(x, training=False)
  x = global_average_layer(x)
  x = tf.keras.layers.Dropout(0.2)(x)
  outputs = prediction_layer(x)
  model = tf.keras.Model(inputs, outputs)

  base_learning_rate = 0.0001
  model.compile(optimizer=tf.keras.optimizers.Adam(lr=base_learning_rate),
                loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
                metrics=['accuracy'])

  model.summary()

  history = model.fit(train_dataset,
                      epochs=10,
                      validation_data=validation_dataset)

KaggleでGoogle ColabやTPUを使うためのTips集

概要

意外とKaggleでColabやTPUを使う情報が少ないので、Kaggle NotebookをTPU対応させたりそれをColab対応させたりするときのTipsをご紹介します。基本はTensorflowに関する記述です。

strategyを定義してmodel.fitのときにstrategy.scope()のブロックで実行するみたいな、基本的な使い方は公式チュートリアル参照のこと(ぶっちゃけ自分もまだこの辺よくわかってなくておまじない的に使ってますが)。 https://cloud.google.com/tpu/docs/tutorials?hl=ja

エラーコードなども随時補完していきたいと思います。

KaggleデータセットをColabから使う方法

私も使うまで知らなかったのですが、TPUを使いたいときには、GCSにTFrecordのような分散させた形で配置したデータセットを用意しないと使えません!。正確にはTFrecordでなくてもGCSに画像を置くだけでもTPUを使ったデータの読み込み&Trainは可能ですが、まともに速度が出ません。

Kaggle datasetは実態としてGCSへ格納されているらしく、GCSのパスを取得することができればこれをColabから利用可能です。

これから先ではPublicなKaggle datasetをColabで使う手順を紹介しますが、Privateなデータセットも認証とか頑張れば行けるらしい。

  • kaggleノートブックでGCSパスを取得

PublicなKaggleデータセットをColabで使うには、KaggleデータセットのGCSパスをKaggleノートブックで取得して、それをColab側で使うことでアクセス可能です。

参考: https://www.kaggle.com/code/tchaye59/efficientnet-tensorflow-baseline-tpu/notebook

使いたいKaggleデータセットをInputにしたノートブックで、下記コードを実行。

from kaggle_datasets import KaggleDatasets
GCS_PATH = KaggleDatasets().get_gcs_path()
print(GCS_PATH)

# 以下出力
gs://kds-c6262c3899ad974e1123f2b7bad13b081bfad9d034edac5d4cfad2bf

これで取得したGCS_PATHを何処かにメモっておき、これをColab側で使います。

  • Colab側での利用方法

参考: https://zenn.dev/karunru/articles/a8f394d7a859b7

Kaggle APIがどうのこうのみたいなしゃらくさい話はさておいて、とりあえずKaggle datasetをColabで利用するための(おそらく)最短手順は下記のとおりです。

GCS_BUCKETNAME = "さっきKaggleノートブックで確認したGCS_PATHから'gs://'を除いた部分"

# パブリックデータセットであっても、authenticationを行う必要があるらしい。
from google.colab import auth
auth.authenticate_user()

# TFDSのtfds.core.GeneratorBasedBuilderに従って作られたデータセットであれば、data_dirとしてGCS_PATHを指定すれば読み込める。読み込めないときは、PATHの深さがずれていないか確認すると良い。
# 例として示しているFGVCDataset は、次のノートブックを参考に作ったTFrecord形式のデータセット。 https://www.kaggle.com/code/tchaye59/efficientnet-tensorflow-baseline-tpu/notebook

data_dir= "gs://" + GCS_BUCKETNAME
builder = FGVCDataset(data_dir=data_dir)

# もしマウントする必要がなければ下記不要。
!echo "deb http://packages.cloud.google.com/apt gcsfuse-bionic main" > /etc/apt/sources.list.d/gcsfuse.list
!curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
!apt update
!apt install gcsfuse
!mkdir -p /kaggle/input
!gcsfuse --implicit-dirs --limit-bytes-per-sec -1 --limit-ops-per-sec -1 " "/kaggle/input"

# これで'/kaggle/input'下にKaggle datasetがマウントされます。
!ls /kaggle/input

ちなみに、一度だけ遭遇したのですが、Kaggle datasetのGCS_PATHが勝手に変わった事があり、それで学習がストップしたことがありました。そういうこともあると思って、もう一度GCS_PATHを取得し直しましょう。

TPU使用時の豆知識

TPUを使っていると、同じコードでも謎にエラーを出すことがあるので、そういうときは慌てずもう一度ランさせましょう。何故か普通に動きます。

例えばこんなエラー。

AlreadyExistsError                        Traceback (most recent call last)
<ipython-input-12-effe1bc08a91> in <module>()
      1 # https://stackoverflow.com/questions/59289014/how-to-check-if-tpu-device-type-is-v2-or-v3
      2 tpu_worker = os.environ['COLAB_TPU_ADDR'].replace('8470', '8466')
----> 3 print(tf.profiler.experimental.client.monitor(tpu_worker,1))
      4 tpu_info = tf.profiler.experimental.client.monitor(tpu_worker,1)
      5 tpu_type = tpu_info.split('\n')[1].split(':')[1].split(" ")[2]

/usr/local/lib/python3.7/dist-packages/tensorflow/python/profiler/profiler_client.py in monitor(service_addr, duration_ms, level)
    162   """
    163   return _pywrap_profiler.monitor(
--> 164       _strip_prefix(service_addr, _GRPC_PREFIX), duration_ms, level, True)
    165 
    166 

AlreadyExistsError: Another profiling session is active

model saveは重みだけをh5で保存する必要あり

TPUで学習させたモデルは、重みだけ保存する必要があるようです。ですので、

model.save("MODEL_NAME.h5")

のように、拡張子をh5にして保存を行います。

TPUのバージョン確認方法

これが意外とどこにも書いてなかった。

Google ColabだとTPUのバージョンを指定できないので、V2とV3でBatchサイズを変えるみたいな処理をしたいことがあると思います(Colab Proだと実際にはV2しか割り当てられなさそうですが……)。そういうときには次のようなやり方でTPUの情報を取得します。

TPU接続後に下記コードを実行。

参考: https://stackoverflow.com/questions/59289014/how-to-check-if-tpu-device-type-is-v2-or-v3

tpu_worker = os.environ['COLAB_TPU_ADDR'].replace('8470', '8466') 
print(tf.profiler.experimental.client.monitor(tpu_worker,1))
tpu_info = tf.profiler.experimental.client.monitor(tpu_worker,1)

# 以下出力
  Timestamp: 13:15:07
  TPU type: TPU v2
  Utilization of TPU Matrix Units (higher is better): 0.000%

ちなみにここで取得したtpu_infoを次のように処理(だいぶ雑ですが)すると、v2またはv3の文字列を取得できるので、これで処理を分けることができます。

tpu_type = tpu_info.split('\n')[1].split(':')[1].split(" ")[2]

# 例えばこんな感じ
if tpu_type == "v2":
  BATCH_SIZE = 512
else:
  BATCH_SIZE = 1024

TPUのパフォーマンス系Tips

参考: https://cloud.google.com/tpu/docs/troubleshooting/trouble-tf?hl=ja#overview

IOがネックになることが多いので、それを回避するあれこれ。

  • BATCHSIZE

バッチサイズは64の倍数にすべし。TPUでは内部的には8個のコアに分散して処理を行っているため、バッチサイズ64ならそれぞれのコアがバッチサイズ64/8=8で学習を行う。

それぞれのコアはTPU v2なら8GB、TPU v3なら16GBのメモリを持っているので、結構大きなサイズで学習させられます。Googleのガイド的には1024から試し始めて、OOMになったら下げるというやり方でBatchサイズを調整するようにアドバイスされています。

TPU利用時にはモデルのコンパイル時にsteps_per_executionという引数を指定することができ、指定した数だけまとめてトレーニングステップを実行してから、TPUからのコールバック(lossのロギングやチェックポイントの保存)がまとめて行われるというもの。

つまり、学習中の

64/346 [====>.........................] - ETA: 2:29 - loss: 0.2038 - accuracy: 0.9377

みたいな表示の更新が、steps_per_executionぶんだけまとめて行われ反映が遅くなり、そのタイミングでチェックポイントの保存も行われることになります。

プログレスバーが常時更新され伸びていくのを見れなくなるのは残念ですが、それ以外特に大きな欠点はないと思うので(要出典)、とりあえず32とか設定しておくとTPUでの学習が速くなると思います。

model.compile(optimizer=tf.keras.optimizers.Adam(), 
                loss='sparse_categorical_crossentropy',
                metrics=["accuracy"],
                steps_per_execution=steps)

Google Colab Proで使えるGPU, TPUの現状(20220410)

まとめ

GPU・TPUガチャの結果に関してはあくまで自分が確認した限りでの情報になりますので、参考程度に見てください

  • 2022年4月現在、Google Colab無料版ではGPUはK80か偶にT4しか引けなかったし、TPUは一度たりとも使えなかった
  • 2022年4月現在、Google Colab ProではGPUはP100がほとんどでたまにT4という感じ。TPUは今のところ100%v2しか使えないものの、割当されないことはなかった。本当はv3使いたいんだけども一度もお目にかかれていません。
    • また、Colabをつかうのであれば気になるところである切断の頻度ですが、TPU v2割当時でも12時間以内の使用であれば意図しない切断は一度も起きていません

欲を言うならGPUならV100、TPUもV3を使いたいところであるが、Colab Proでは今のところ一度も割当されません。月5000円のColab Pro+ を契約しろということでしょう。

とはいえ約月1000円という価格を考えれば、P100やTPU v2が自由に使えるというだけでも十二分です。特にKaggleの大規模なデータセットを扱ってTPUのデカいメモリの有難みを思い知りました。最近はGPUは使わずTPU v2を1日中使ってモデルを改良してます。

ここから先はダラダラとしたGoogle Colabを使い始めた経緯を書いているだけなので、興味のある人だけどうぞ。

いきさつ

最近データサイエンスの勉強の腕試しということで、Kaggleを始めた。

参加中のコンペはSorghum -100 Cultivar Identification - FGVC 9というやつで、草の画像を100種の品種のうちどれだか当てられるモデルを作るというもの。

レーニングとテストそれぞれ1024x1024の解像度の画像が22000枚程度あり、これを使って学習アンド評価を行うわけである。

最初のトライということで、なるべくデータがシンプルなものがいいなと思って、画像から品種の分類というシンプル極まりないタスクであるこいつをデビュー戦に選んだ。

まだ1ヶ月ほど時間があるのですが、順位は最高5位/90チームくらいまで上がり現在は10位/115チーム。うまく行けばブロンズくらいは取れるかも?と思って日夜モデルの改善に励んでおります。

このコンペは画像サイズがデカく枚数も多いので、なかなか学習に苦労する。今自宅で使える計算リソースはメインのデスクトップ(Ryzen5 5600x + RX6900XT)と過去紹介したこともあるお手製AIサーバー(i5 6400 + K40)で、最初の方はMobilenetみたいな軽めのCNNの転移学習でベースラインを作っていたのでなんとかなっていたが、結局今メインで育てているEfficientNetV2みたいな最近のデカ目のモデルを詰めていく段になると、CPUやK40じゃどうにも時間がかかりすぎる。

https://hashicco.hatenablog.com/entry/2020/05/30/002945

ということで、途中からKaggleのノートブックに実行環境を移しGPU(ほとんどP100)や、少しコードに手を加えてTPU対応してTPUv3を使ってモデル構築に取り組み始めました。

ただ、KaggleのGPU,TPUにはクオータ(週制限)があり、それぞれ週20時間、週40時間しか使えない。大体週の前半で使い切ってしまうのでこれだと困る。

そんな計算環境難民の脱出先として有名なのはGoogle Colabでしょう。基本無料で使える上、太っ腹にもGPUとTPUまで使わせてくれるというのであるから使わない手はない。

で、久々に無料版Google Colabを使ってみたところ、いくらガチャしようとも全然まともなGPUを掴めない!TPUに至っては掴めすらしない! もう2022年だというのにK80かよくてもT4しか使えないとなるとKaggleでは戦えない。

こういう経緯でしゃーなしにGoogle Colab Proに登録して1ヶ月くらい使ってみましたので、実際使えるリソースや切断頻度の現状を記しておきます。可能であれば随時更新していきます。

HPのウルトラワイドモニター X34を買った

概要

FF14プレイヤーなら一度は耳にするであろう、「ウルトラワイドモニターは視界が広くてプレイしやすい」との噂。

今まで23インチ FHD(EIZOFlexscan), 27インチWQHD(NECLCD-PA271W), 31インチ4K(Acer ET322QK C)と着実にモニタをサイズ&解像度アップして買い替えてきたのだが、ウルトラワイドモニターは対応してないゲームがあるとか、16:9映像視聴時に31インチ4Kよりも表示面積が狭くなるとか考えて手を出していなかった。

ただ、最近はウルトラワイドモニターの新製品発表数も増えてきて市民権を獲得しつつあるような雰囲気。冬ボーナスもほとんど手を付けてなかったし、物は試しということで買ってみることとした。

ついでに今までは何故かほとんどクリエイター向けモニターを買ってきたこともあり、60Hzより上のリフレッシュレートや1ms低遅延のようなゲーミング機能をまともに体験したことがなく、この辺も対応しているものを選定することにした。

自分が調べている中で34インチ以上のゲーミングウルトラワイドで定番品ぽかったのはDellのAW3821DWHUAWEIのMateView 34LGのUltraGear 34GL750-Bあたり。

とりあえずお金があるならDellのAW3821DWが良さげだったが、納期が長そうなのと発売が2年近く前の製品なので買った瞬間型落ちになりそうなのが嫌で選ばず。他の2製品のどっちかで決めようかと思っていたところ、全く眼中になかったHPのX34という製品を発見。

jp.ext.hp.com

34型 3440x1440、IPS、オーバードライブでGtG 1msの低遅延、最大165Hz、FreeSync Premium対応と私の必要としていたスペックはほぼほぼ満たされていながら購入時キャンペーン価格で48,730円(送料、税込み)と破格のお値段。お金は気にせず買うつもりだったのですが、お得に買えるならそれに越したことはない。

まあインプット端子の少なさや非曲面、表示色数が8bitなところとか随所にコストカットの跡が見えるのですが、どうせゲームとか事務作業、プログラミングで使うだけなので全然飲める程度のスペックダウンと判断。非曲面なのはむしろ良いポイントかも知れないし。

ということで全くと言っていいほど日本語のレビューが見つからなかったのは気になったのですが、HP X34を買ってみましたという話。

まとめ

  • HP X34は情報こそ少ないもののまともなウルトラワイドモニター(だと思う)。動体視力よくないし色彩センスも並なのであんまり良し悪しはわからないあくまで個人の意見です。
    • とりあえずUFOテストとか見てみた感じ、ちゃんと165Hzの表示は出来てるし妙なゴーストとかもないと思う。
    • 一方、画面の明るさが均一でない感じがするので表示品質はいまいちかも。
    • 今ならキャンペーン価格で48,730円(送料、税込み)で買えるので、とりあえずお試し気分で買っても後悔はしないと思う
  • あと、コンシューマーゲーム機の接続も考慮されており、Switchとかつないだときはちゃんと16:9で表示してくれる(もちろんサイドには黒帯が入りますが)。
  • FF14の表示も良好。確かに横長で表示面積が広くなるのでちょっとギミック処理しやすい気がする。
    • なによりHUDの配置が前よりも自由度高くなったのが嬉しい。端の方に重要度の低いものを置いてあげると真ん中スッキリしてプレイフィールも良くなる。
    • あと、4Kよりも解像度が落ちたこともありRX6900XTなら一応最高品質120Hz以上は安定して出ている印象(流石に165Hz張り付きは厳しい)。明らかに60Hzよりもなめらかに視点が動くのでプレイしやすいと感じる。

外観とか

付属品として電源、DP1.4、HDMI2.0のケーブルが付いてきますので、特にケーブルの準備は必要なし。この値段で付属品もしっかりついてくるのはありがたい。

スタンドの組み立ても簡単。このサイズなら全然一人でもいけます。

どこぞの元環境大臣じゃありませんが、やっぱりウルトラワイドモニターだけあって超横長です。 スタンドが少し安っぽいですが、角度・高さも若干調整できるので機能的には全然問題なし。気になるならモニターアームとか買いましょう。

f:id:hashicco:20220213191719j:plain

モニター設定はリモコンなどないので裏側のボタンをポチポチするタイプ。LGとかのジョイスティックタイプでもなく、シンプルに4種のボタンで操作します。必要そうな設定項目は一通りある気がする。

f:id:hashicco:20220213192256j:plain

UFOテストを240Hzスローモーション撮影してみたところ。別に専用機材で撮ったわけではなくスマホ(Surface Duo)の映像なのであんまり当てにはなりませんが、若干の残像感はあるもののまともに表示できてるように見えます。というか他の環境を知らないのでぶっちゃけよくわからん。 f:id:hashicco:20220213191406g:plain

今我が家では3枚のモニターをこんな感じに設置中。右のでかいのが今までメインで使っていたAcer ET322QK Cで、アームで高い位置においているのがFHDのサブモニターBenQ GW2406Z。ホントはET322QKをエルゴトロンのアームで吊るす予定だったのですが、重すぎて設置場所の木の板がミシミシ言いよったので諦めてサイドテーブルに乗せることにしました。前よりもET322QKが近くにあるので圧迫感がすごいです。 f:id:hashicco:20220213191637j:plain

LG G8Xが割れたのでSurface duo(ATT locked)に買い替えた ~米尼で買ってワイモバSIMで使うまで~

概要

こないだ人生で初めてスマホを落として割ってしまった。タッチ切れは起こっておらず画面内指紋認証も問題なく効いており使い続けられるものの、割れた画面を見るたびなんとなくテンションが下がる。

使っていたのはLGのG8Xというやつで、スナドラ855、メモリ6GBと無難なハイスペックかつ専用のカバーをつけると2画面になるというテッキーなやつ。しかもそこまで高くなく、中古で3万ちょいで買えたのでなかなかお気に入りのスマホだった。

最初は物珍しかった2画面のカバーはほぼほぼ使っておらず、生身で本体だけで持ち歩いていたところキレイに画面側から石畳に叩きつけられてバリバリになってしまった。

LGはスマホ事業から撤退しており安価な2画面系列のVelvet系の新作は望めないし、G8Xの純粋な後継機のV50やV60は高すぎるので微妙。学生時代は割れたジャンクスマホを直してゴニョゴニョとかやっていたけれど、定常収入のある大人になった今手間のほうが勝ってしまう。ちなみに自分で直したスマホ技適違反になることがあるらしいから要注意な!

ということでかれこれ2ヶ月位次なる相棒を探していたのだが、なかなかG8Xほど尖っててコスパの良いスマホが見つからない。Androidは値下がりしたPixel5aもあったしPixel6が出るというのもあって期待していたのだが、思ったよりも心惹かれず。6s以来久しぶりにiPhoneに戻るという選択肢もないでもないが、正直カメラとプロセッサ性能が順当に進化しているだけという気がして好きになれない。

で結局、表題の通りまたも2画面スマホであるSurface duoを買うことにした。 せっかくなら変なスマホ使いたいよね!というニーズをそこそこの価格で満たしてくれる機種じゃないかと思います。

ここから先は1年以上前に出た機種で今更ですがちょっとした使用感レビューと、これまた既に色んな人がチャレンジしてやり方を書いてくれているAT&TSIMロック解除を実際にやってみた経緯を書いていきます。

まとめ

使うまで

  • Surface Duoは米尼から国内輸入可能。AT&Tのロック付きなら新品256GBでも$428(SIMフリーのやつは$654)。
    • 送料やImport feeなど色々込みだと60000円くらい。円安きついね……。
  • AT&TSIMロック版も頑張れば解除して国内で使えるようになる(私はワイモバSIMで使ってます)。2万弱節約できるので手間かける価値はあると思う

使用感

  • やっぱり外付け2画面のG8Xよりも、純2画面スマホであるSurface duoはハードとしての完成度が高い。薄いし軽いし質感もよい
  • しかしソフト面はイマイチ。外折で片画面で使おうとすると、しょっちゅう開いている判定されて裏側誤タッチで変なアプリ開いてああああとなること多発
    • この辺G8Xは手動で強制片画面とかにできたのでそういう機能があると普段使いしやすくなりそう
    • 同じSoC、メモリサイズなはずなのに、なんとなくG8Xよりも動作がもっさりしている気が。BGタスクが多いのか制御系が悪いのか?
  • カメラはインカメしかないことに注意!まあブログに載せる用の写真くらいは問題なく撮れます。
  • 大昔のSurface Pro3のペンを持っているのだが、なんとそのペンがSurface duoでも普通に使えた。別に手書きしたい欲求はなかったのだが、Slimペンを買おうとすると1万以上するのでちょっと得した気分。

ただ2画面スマホを試したいだけだったら個人的には3万以内で買えるであろうLG G8Xの中古でも買ってみることをおすすめする。ちょっと重いがクセのないアスペクト比、そこそこの性能の背面カメラもあり、着脱で1画面運用もできる。

で、Surface duoは……、まあなんか良い質感の面白スマホを求めているけど2桁万円は出したくない人にはおすすめです。ほんと、質感はよくてプレミアムって感じです。ただ買ってみて投げ売りされている理由がわかった気がする……。

これを言っては元も子もないのだが、ぶっちゃけ田舎の引きこもりには2画面スマホは持て余す!昔のように通勤電車に長時間揺られたり、位置ゲーやってたり、複数SNSやってたりするなら意味もあるのかもしれないけど、2画面の用途が思いつかない人は素直にPixel6を買ったほうが幸せになれるでしょう。スマホの2画面はあったら使うようになるものではない」、というのが2年近く2画面スマホを使った結論です。

ただこれらは大した理由なく2度も2画面スマホを買った人並みの感想です。他では結構いい評価だったりするので、用途が合えば良いものだと思います。

開梱

Amazon.comで購入し海を渡ってやってきたSurface Duo。特に通関なども問題なく、11月16日の購入から11月25日到着

箱めちゃでかい。充電器、ケーブルに加えバンパーもついてくる。ただ画面保護フィルムやカバーなどはついていないので必要なら一緒に買って置くと良いかもしれない。

f:id:hashicco:20211221001117j:plain

また、決済完了から約1ヶ月後くらいにいくらかリファンドがあり結局支払総額は6万しないくらいでした。

SIMフリーにするまでのやりとり

基本はこちらの記事を参考に、1. AT&TSIMロック解除申請 → 2. 数日待ってからMSサポートへヘルプ要請 → (3. MSに再連絡) → 4. 更に待つとAT&TからしれっとSIM解除コードが届く という流れで、計2週間でSIMフリーになりました。

1.AT&TでのSIMロック解除申請

www.att.com

ここで申請。特にチャットなど必要なく、IMEIとメアドなど入力するフォームを埋めるだけ。

ただ、一点注意なのがフォーム入力後メアド、申請確認用のメールが届くのですが、これの確認URLを踏まないといつまでもステータスが先に進みません。届いたメールは見逃さないように注意!

2.MSサポートへヘルプ要請

AT&Tに連絡しただけだといつまでもステータスIN-PROGRESSのまま動かないらしい。ということで、マイクロソフトのサポートに連絡を取らねばならない。URLはこちらMSアカウントへのログイン、言語をEnglishにする必要があります。

MSに連絡するのは早すぎてもだめらしく、AT&T連絡から数営業日くらい待ちましょう。 後でも書きますが、私は気がはやり2日位で連絡したせいなのか、余計なステップが1つ増えました。

で、米国MSに連絡するので当然時差を考えなければいけない。だいたいJST23時過ぎになると向こうのチャットサポートがオープンする。

最初の文面はこんな感じのものを準備しておきました(一応載せときますが英語があっている保証はないので自己責任で!)。結構フレンドリーに話しかけてくれてアドリブも必要になりますが、困ったらDeepLでも使いましょう。

AT&T Request number: NULXXXXXXXXXXX

IMEI: XXXXXXXXXXXX

S/N: XXXXXXXXXXXX

Name: XXXX XXXX

Mail address: xxxxxxxxx@gmail.com

Phone No: +81 XX XXXX XXXX

Hello.

I bought a new Surface Duo at amazon.com. This device is locked by AT&T carrier.

I requested AT&T to unlock it a couple of days ago. But have not heard back yet. (Req # NULXXXXXXXXXX status: IN-PROGRESS)

I am contacting here because I heard on the web that AT&T cannot provide unlock code and I need to consult Microsoft.

Sincerely,

XXXX XXXX

で、私はATTに解除コード申請してから2日位で連絡してしまったのですが、ちょっと早すぎたらしくすぐには対応できないと言われ、チャット担当者に直接連絡できるメアドをゲットして終了しました。

3. 少し待ってMSに再連絡

MSに連絡してから5営業日待ってみたもののATTからもMSからも音沙汰なし。ということでもらった直接連絡用メアドへ「あれから数日待ってみたけどだめっぽい。あなたの助けが必要だ!」的な連絡をしてみました。

すると翌日くらいに「連絡ありがとう。トラブルシューティング開始したよ!」と返事が来ました。

4.さらに1週間くらい待つとAT&TからSIM解除コードが送られてきた

どうやら上のノートの記事と異なって、MSからではなくATTから16桁の数字の長い解除コードが送られてきました。

ワイモバイルのSIMをSurface Duo本体に差し込んで再起動すると、コード入力画面が出現するのでそこにこの16桁数字を入力すると無事SIMロック解除されました!

APN設定はこちらを参考に設定。ちゃんと4Gの電波を掴んでくれています。

(ときどきG8Xと比較しながら)使用感レビュー!

ベンチマークで比較

比較は同じSD855、RAM 6GBのLG G8X VS Surface Duo。体感だとSurface Duoのほうがもっさりしてる気がするんですが、数値的にはSurface Duoの方が良いらしい。まあ中古で買って1年半フルで使ったG8Xと新品のSurface Duoの比較なんで参考記録として見ていただければ。

使用ソフト:3DmarkとGeekBench、バッテリーセーブを解除して充電しながらの測定です。

G8X

  • 3DMark wildlife Score 1898, FPS 11.40, Temp 31-35
  • 3DMark slingshot Overall 5584, Grph 7494, Phy 2951, Temp 32-35
  • GeekBench CPU Single 387, Multi 2012
  • GeekBench Compute(OpenCL) 1924

Surface Duo

  • 3DMark wildlife Score 2142, FPS 12.80, Temp 38-42
  • 3DMark slingshot Overall 7047, Grph 8734, Phy 4205, Temp 39-47
  • GeekBench CPU Single 761, Multi 2759
  • GeekBench Compute(OpenCL) 2493

カメラ

最近は滅多にカメラを使わないので良いのですが、Surface Duoには背面カメラがありません。インカメしかないので、2つ折りモードでカメラがない方の画面にプレビューが表示されて撮影する感じです。

f:id:hashicco:20211221001836j:plain

直近唯一撮ったピザの写真がこんな感じ。まあインカメといえどもそこそこ見れるものが撮れてると思いますが、最近のでかい背面カメラを搭載しているスマホたちと比べるようなものではないでしょう。

画面サイズ比較

この写真は先々代のスマホであるPixel3で撮ってます。なんかやけに白飛んじゃってますがご愛嬌。

f:id:hashicco:20220209225815j:plain

左のバキバキになってるのがG8X。右がSurface Duo。表示面積はおんなじくらいです。

f:id:hashicco:20211221002259j:plain

一画面同士の比較。上がSurface Duoです。やはりアスペクト比の違いがあります。

f:id:hashicco:20211221002421j:plain

開いた状態で右下をあわせて見たところ。Surface Duoのほうが指一本分くらい横に大きく、同じく指一本分くらい縦に短いです。

f:id:hashicco:20211221002517j:plain

折りたたみ状態での比較。持ちやすさは横幅の小さいG8Xのほうが上でした。

f:id:hashicco:20211221002617j:plain

全画面表示で例の草原を表示させたところ。こういう風景だと真ん中が少し見えないくらいは気になりませんが、実際アプリを全画面で使うときに非表示の領域ができるのはイマイチ。Microsoftの専用アプリ群や電子書籍か、2画面別々のアプリを開いて使うのが良いでしょう。

使用感

で、肝心の使用感ですが、第一印象はとにかくでかい!横に。

標準的な日本人の手のサイズだと楽には画面の端まで指が届かない。落ち着いて使える環境では両手で持つのがベター。

このアスペクト比一行の表示領域が長く、文章を読むのに結構便利。基本片画面で使っているのですが、表示に関しては文句なしです。

また、2画面アタッチ装備のG8Xよりは軽いとはいえ、250グラムの重量級スマホなので、やはり片手でハンドリングするのは大変。歩きながら使うのは落としそうで結構怖いです。

指紋センサーは電源ボタンなどからは独立してサイドにあり、割と認証精度はいい感じ

良いところは結構あるのですが、まとめで書いたとおり、折りたたみの認識がうまく行かないことが多々あり、片画面使用に難ありです。なんか操作おかしいなーと思うと裏側の画面が反応しており、関係ないアプリが起動してしまっていたり変な文字が入力されていることが。

なんかソフトウェアアップデートとかで解決してくれれば嬉しいのですが……。

正直使えるようになるまでの手間と値段を考えると、あんまり他人におすすめできないかなーと言うのが使い始めて2週間位たった今の正直な感想。慣れてくればこれらの不満も解消するかもしれないので、感想が変わったら随時追記していきたいと思います。