1 Introduction
Yin, H., Liu, P., Liu, K., Cao, L., Zhang, L., Gao, Y., & Hei, X. (2020). ns3-ai : Fostering Artificial Intelligence Algorithms for Networking Research. Workshop on Ns-3 – WNS3 2020, 57–64. 知乎解讀
ns3-ai是對ns3-gym的改進,實作了記憶體共享,程序間通信(IPC)速度比ns3-gym快100倍。
NS3-AI App Store
2 installation
- 確定ns3版本為3.30
- 下載下傳NS3 App Store(download按鈕)或github上的壓縮包,解壓後再添加到ns-3.30中的src目錄下,并重新命名為ns3-ai.
# 重命名的方法,例如
mv /home/jnbai/桌面/tarballs/ns-allinone-3.30/ns-3.30/contrib/ns3-ai-1.0.0 /home/jnbai/桌面/tarballs/ns-allinone-3.30/ns-3.30/contrib/ns3-ai
- 重新編譯ns-3.30
# 在ns-3.30目錄下執行
./waf configure
./waf
- 添加python interface
# 在ns-3.30目錄下執行
cd contrib/ns3-ai/py_interface
# python setup.py install --user
# pip3 install . --user
python3 setup.py install --user
- 測試安裝是否成功
- tips1: 以運作RL-TCP為例,這個項目要在兩個終端視窗上同時運作
- tips2: 以下代碼是預設root使用者執行
# terminal 1:運作ns-3 (c++ code)
cp -r contrib/ns3-ai/example/rl-tcp scratch/
./waf --run "rl-tcp"
# terminal 2:運作ai (python code)
cd contrib/ns3-ai/example/rl-tcp/
python3 testtcp.py
兩個terminal運作如下圖,說明安裝成功!
3 Examples
安裝好後,通過簡單的例子(所有例子在這裡)學習一下如何使用ns3-gym。
3.1 基本接口 Basic Interface
- python腳本例子。其中,
用來在目前工作目錄中啟動ns-3模拟腳本。gym.make('ns3-v0')
import gym
import ns3gym
import MyAgent
env = gym.make('ns3-v0')
obs = env.reset()
agent = MyAgent.Agent()
while True:
action = agent.get_action(obs)
obs, reward, done, info, = env.step(action)
if done:
break
env.close()
- 所有的ns-3模拟腳本都可以作為Gym的環境。隻需要執行個體化OpenGymInterface和運作ns3-gym C++接口(ns3-gym C++接口由以下函數組成:)
Ptr<OpenGymSpace> GetObservationSpace();
Ptr<OpenGymSpace> GetActionSpace();
Ptr<OpenGymDataContainer> GetObservation();
float GetReward();
bool GetGameOver();
std::string GetExtraInfo();
bool ExecuteActions(Ptr<OpenGymDataContainer> action);
其中,ns3-gym的通用接口可以在ns3仿真環境中獲得變量和參數。詳見paper
3.2 Cognitive Radio
認知無線電:通過感覺環境空間,識别并利用該空間可用的頻譜,進而限制和減低沖突的發生。
無線電:可以在空間中(包括空氣和真空)傳播的電磁波,有一定的頻帶(e.g. 3KHz~3THz)。
本例中,考慮在無線多信道環境中,無線電的信道選擇問題,例如有外部接口的802.11網絡。
agent的action:選擇無幹擾的信道。本例的設定為,外部幹擾遵循周期模式,即t=1時,幹擾信道channel=1…如下圖,黑色表示對信道的外部幹擾。
3.3 RL-TCP
此例中,通過觀測TCP執行個體的參數,實作控制TCP的
congestion window (cwdn)
和
slow start threshold
。實作了兩個版本,time and event-based,都是繼承于
TcpCongestionOps
,是以可以用作
ns3::TcpL4Protocol::SocketType
,code : tcp_base.py。
并且,關于使用event-based的界面,我們有一個例子:運作TCP NewReno并且使用ns3gym仿真的Python Gym agent,code : tcp_newreno.py。這個例子可以用作學習實作基于RL的TCP擁塞控制的起點。
運作這個例子,執行:
cd ./scratch/rl-tcp
./test_tcp.py
或者,在兩個終端裡:
# Terminal 1:
./waf --run "rl-tcp --transport_prot=TcpRl"
# Terminal 2:
cd ./scratch/rl-tcp/
./test_tcp.py --start=0
Tips:在這個例子的運作中,i.e. Python TCP NewReno,與在ns3中運作時,資料包的傳輸數量是相同的(請參見ns-3仿真的輸出,即兩種情況下的RxPkts:5367)。可以執行以下指令進行交叉檢查: