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)。可以执行以下命令进行交叉检查: