Wi-FiネットワークをOptunaで最適化してみた
概要
Optunaというハイパーパラメータ最適化ツールがあります。
本来は機械学習で使用するOptunaですが、この記事ではWi-Fi(IEEE 802.11n)のパラメータ最適化に使用してみました。先に結論を言いますと 75.3Mbps から 109.0Mbp に高速化しました。Optunaを使用する理由
IEEE 802.11nには複数のパラメータがあり、手持ちのデバイスで使用できるものだけでも8個のon/offスイッチと1つの値(256 - 8192)があります。これらを全探索すると2^8 * (8192 - 256) = 2031616 となり、約200万通りを試す必要があります。一度全て試したとしても、オフィスの配置換えや、近隣にアクセスポイントが新設される等で電波環境は頻繁に変わります。そこで、比較的短時間で最適化を実行する方法としてOptunaを選択しました。
測定条件
使用するAP(Wi-Fiアクセスポイント)
IEEE 802.11nの設定が自由にできる市販のAPは無いため、hostapdというOSSを使用してソフトウェアアクセスポイントを起動します。
測定方法
iperfにて下記コマンドで測定します。AP側がiperfクライアントです。APとステーションは一対一接続です。
/usr/bin/iperf -c 192.168.100.2 -p 5201 -l 128M
Optunaソース
Optunaで最適化するパラメータは以下の通りです。下記パラメータの組み合わせをhostapd.confのht_capabに設定します。
※ SM_Power_Save, HT_greenfield, HT_delayed_Block_Ack, L_SIG_TXOP_protection_supportは対象外としています。手持ちのWi-Fiカードのドライバがサポートしていないためです。
※ HT40- の場合のチャンネルは40ch、HT40+ の場合のチャンネルは36chを使用します。
def objective(trial):
params = {
'LDPC_coding_capability': trial.suggest_categorical('LDPC_coding_capability', ['[LDPC]', '']),
'Supported_channel_width_set': trial.suggest_categorical('Supported_channel_width_set', ['[HT40-]', '[HT40+]']),
#'SM_Power_Save': trial.suggest_categorical('SM_Power_Save', ['[SMPS-STATIC]', '[SMPS-DYNAMIC]', '']),
#'HT_greenfield': trial.suggest_categorical('HT_greenfield', ['[GF]', '']),
'Short_GI_20': trial.suggest_categorical('Short_GI_20', ['[SHORT-GI-20]', '']),
'Short_GI_40': trial.suggest_categorical('Short_GI_40', ['[SHORT-GI-40]', '']),
'Tx_STBC': trial.suggest_categorical('Tx_STBC', ['[TX-STBC]', '']),
'Rx_STBC': trial.suggest_categorical('Rx_STBC', ['[RX-STBC]', '']),
#'HT_delayed_Block_Ack': trial.suggest_categorical('HT_delayed_Block_Ack', ['[DELAYED-BA]', '']),
'Maximum_A_MSDU_length': trial.suggest_int('Maximum_A_MSDU_length', 256, 8192),
'DSSS_CCK_Mode': trial.suggest_categorical('DSSS_CCK_Mode', ['[DSSS_CCK-40]', '']),
'40MHz_intolerant': trial.suggest_categorical('40MHz_intolerant', ['[40-INTOLERANT]', '']),
#'L_SIG_TXOP_protection_support': trial.suggest_categorical('L_SIG_TXOP_protection_support', ['[LSIG-TXOP-PROT]', '']),
}
試行回数は128に設定しています。
study = optuna.create_study()
study.optimize(objective, n_trials=128)
結果
最適化前
下記のデフォルトで測定した場合は75.3Mbpsでした。
ht_capab=[HT40+]
channel=40
最適化後
Optunaの最適化の結果は下記の設定で109.0Mbpsでした。最適化に要した時間は 20 分でした。
ht_capab=[LDPC][HT40+][SHORT-GI-20][SHORT-GI-40][RX-STBC][MAX-AMSDU-5004]
channel=40
途中経過
128回の試行におけるスループットの推移です。外れ値が2箇所ありますね。たまたまなのか、パラメータによるものなのか検討が必要です(この記事ではやりません)。
事前予測と比較してどうか
実験を行う前はShort_GI_20, Short_GI_40, Maximum_A_MSDU_length辺りが効くものだと思っていたのですが、重ねてみるとそれほど顕著な相関があるわけでは無さそうですね。これだけでもやってみた甲斐がありました。
(上からスループット、Short_GI_20のon/off、Short_GI_40のon/off、Maximum_A_MSDU_lengthの値です。スケールはバラバラです)
結論
Optunaによる最適化、有効そうです。他の用途にも試してみようと思います。
Discussion