Help us understand the problem. What is going on with this article?

Wi-FiネットワークをOptunaで最適化してみた

概要

Optunaというハイパーパラメータ最適化ツールがあります。
https://research.preferred.jp/2018/12/optuna-release/
本来は機械学習で使用する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箇所ありますね。たまたまなのか、パラメータによるものなのか検討が必要です(この記事ではやりません)。
graph.png

事前予測と比較してどうか

実験を行う前はShort_GI_20, Short_GI_40, Maximum_A_MSDU_length辺りが効くものだと思っていたのですが、重ねてみるとそれほど顕著な相関があるわけでは無さそうですね。これだけでもやってみた甲斐がありました。
(上からスループット、Short_GI_20のon/off、Short_GI_40のon/off、Maximum_A_MSDU_lengthの値です。スケールはバラバラです)
graph_mix.png

結論

Optunaによる最適化、有効そうです。他の用途にも試してみようと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした