Matteo Drago 외 연구진들은 RAN-AI라는 ns3환경에서 시뮬레이션 되는 새로운 엔티티를 개발하였다.
매우 동적인 V2X 시스템에서 QoS는 언제든 예기치 못하게 변경 또는 저하될 수 있다. 사람의 안전과 직결되는 교통수단에서 통신 장애는 치명적인 결과를 초래할 수 있다. 이를 위해 QoS를 사전에 예측하여 그에 따라 애플리케이션을 통제한다는 개념인 PQoS(Predictive Quality of Service)를 도입했다. 바로 RAN-AI는 V2X 네트워크를 위한 PQoS 메커니즘이다.
RAN-AI는 PQoS 입력을 바탕으로 적절한 조치(e.g., 스케쥴링 결정 변경, propagation condition의 function에 따른 무선자원할당 적용, 네트워크 용량에 기반한 traffic request 변조, system numerology 수정을 통한 탄력적인 통신 채널 제공)를 취해야 한다.
또 다른 방법으로는 전송 전 애플리케이션 계층에서 생성되는 데이터의 크기를 줄이는 것이다.
RAN-AI 시뮬레이션 수행은 ns-3를 통해 이루어졌다. 이는 ns3-gym 프레임워크를 확장한 형태이다.
논문 참고
먼저 OpenStreetMap과 같은 오픈소스 지도에서 osm 파일을 가져온다.
‘내보내기’ 버튼을 눌러 직접 파일을 저장할 수도 있고,
wget -O inputPolygon/SanFrancisco.osm “https://api.openstreetmap.org/api/0.6/map?bbox=-122.4115,37.7814,-122.3899,37.7965"
으로 CLI를 통해 받아오는 것도 가능하다. 그런데 이때 파일을 ‘inputPolygon’ 디렉토리에 저장하는 것은 GEMV 다운로드를 완료한 상태에서 하는건데, 다른 디렉토리에서 먼저 아래 과정을 수행하고 파일들을 나중에 ‘inputPolygon’ 으로 복사해도 상관은 없다.
이렇게 해서 저장된 .osm
파일을 xml 파일로 변환해주어야 한다. SUMO에는 여러 종류의 xml 파일이 있는데, 교통 인프라 네트워크인 net.xml
, 루트 파일인 trips.xml
및 rou.xml
등이 있다. 우선 netconfverter를 이용하여 osm 파일을 net.xml
파일로 변환해 주어야 한다.
netconvert --osm inputPolygon/ SanFrancisco.osm -o inputPolygon/SanFrancisco.net.xml --geometry.remove --ramps.guess --junctions.join --tls.guess-signals --tls.discard-simple --tls.join --remove-edges.by-type railway.subway
그 후 randomTrips.py
를 이용해 랜덤하게 차량들의 경로를 생성하고, trips.xml
로 저장한다. 이 때 차량의 개수를 저장해준다.
randomTrips.py -n inputPolygon/ SanFrancisco.net.xml -e 20 -o inputPolygon/SanFrancisco.trips.xml
그 후 duarouter를 이용해 rou.xml
파일을 생성한다.
duarouter -n inputPolygon/SanFrancisco.net.xml --route-files inputPolygon/SanFrancisco.trips.xml -o inputPolygon/SanFrancisco.rou.xml --ignore-errors
시뮬레이션에 필요한 파일 경로와 같은 기본 정보나 시뮬레이션 시간 등의 파라미터는 sumo.cfg
파일에 저장해 준 후, 이 sumo.cfg
파일을 이용해 SUMO simulation을 실행한다.
sumo -c SanFrancisco.sumo.cfg
위 SanFrancisco.sumo.cfg
파일에서 알 수 있듯 시뮬레이션 결과는 inputMobilitySUMO 폴더 안에 SanFrancisco-mobility-trace.xml
파일로 저장된다.
그럼 이제 matlab으로 GEMV 시뮬레이션을 실행할 준비가 된것이다.
OpenStreetMap을 이용해 바로 파일을 받아오는 방법 외에, osmWebWizard.py
를 사용하는 방법이 있다. osmWebWizard.py
를 통해 더 간편하게 지도를 다운로드 받을 수 있다. 파일의 위치를 찾기 힘들다면 find
를 이용하자.
sudo find / -n osmWebWizard.py
만들어 둔 xml 파일을 돌리기 위해 우선 simSetting.m
파일에 SanFracisco case를 추가해주고, 시뮬레이션을 실행한다.
>> runSimulation
시뮬레이션이 완료되면 kml 파일과 csv 파일이 ‘outputKML’, ‘outputSim’ 디렉토리에 저장된다.
Kml 파일은 구글어스로 시각화 할 수 있다.
Ran-ai 환경을 구축하기 위해 Anaconda를 이용하는 것이 좋다.
sudo apt-get install -y libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6
# https://docs.anaconda.com/free/anaconda/allpkglists/
curl --output anaconda.sh https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
shasum -a 256 anaconda.sh # 무결성 확인
bash ./anaconda.sh
sudo nano ~/.bashrc
마지막 줄에 export PATH=~/anaconda3/bin:~/anaconda3/condabin:$PATH
추가해준다.
source ~/.bashrc
Ran-ai 코드를 받아준다.
git clone https://github.com/signetlabdei/ns3-ran-ai.git
그 후 conda 환경 세팅을 해준다.
conda create -n ns3 python=3.10
conda activate ns3
conda install numpy tensorflow pytorch pandas seaborn matplotlib=3.6 psutil ipywidgets conda-forge::tikzplotlib
pip install pickle5 sem
Python interface를 추가해준다.
cd contrib/ns3-ai/py_interface
pip3 install . --user
cd ../../..
Python interface를 위한 환경 변수를 추가해준다.
export PYTHONPATH=/home/host/.local/lib/python3.10/site-packages/ns3_ai-0.0.2-py3.10-linux-x86_64.egg:$ PYTHONPATH
Offline learning
python3 scratch/ran-ai/get_offline_stats.py -run
python3 scratch/ran-ai/run.py -train -run -offline -episode 100
오프라인 데이터를 생성하기 위해 get_offline_stats.py
파일을 실행한다.
get_offline_stats.py
를 run 할 때, 여러가지 error 상황에 부딪히게 된다. 우선 python 코드 내부의 경로를 수정해주어야 한다. Import 구문 사이에 sys.path.append(os.path.abspath('.'))
를 추가해 준다. params_grid
리스트에는 gemvTracesPath
와 appTracesPath
로 파일 경로를 명시해 주고 있다. 이를 내가 사용하는 실제 파일 경로로 변경해 주었다.
그 후 ns3 실행 파일인 waf
가 있는 폴더를 설정해주어야 한다. ns_path = '/home/host/ns3-ran-ai'
로 설정해준 후 코드를 실행시키게 되면 error: ‘numeric_limits’ is not a member of ‘std’라는 std 에러가 발생한다. 이 에러는 csv-reader.cc
파일의 오류로 csv-reader.h
파일에 <stddef.h>
파일과 <limits>
파일을 include함으로써 해결 가능하다. → ns3 설치 참고.
Online learning
python3 scratch/ran-ai/run.py -train -run -episode 100
Simulation.py의 initialize_simulation()
함수에 의해 “TRAINING”이라는 단어가 출력되고 os.makedirs() 함수에 의해 /output/train/
및 하위 폴더가 새롭게 생성된다.
처음 training을 실행시키기 위해 parser에 -run
을 활성해 해주었고, get_input()
함수의 running = args['run']
에 의해 running
이라는 변수가 True가 된다.
initialize_simulation
이 완료되면, 메모리 설정을 위해 Experiment()
함수가 실행된다. 이 함수로 생성된 설정값들은 experiment
라는 변수에 저장되게 된다. 이 때 Experiment()함수 4번째 파라미터를 ns3-ran-ai
의 경로로 설정해준다.
experiment
설정이 완료되면 initialize_online_episode()
함수가 실행된다.