The difference from the existing QoE Prediction(ric-app-qp) is that the function to interact with the MLxApp of AIMLFW is added and the inference function is removing.
The main operations are as follows:
-#. Traffic Steering xApp transmits prediction request to QoE Prediction assist xApp.
-#. QoE Prediction assist xApp builds prediction request message using cell metrics from influxdb and then sends prediction request to MLxApp. Cell Metrics are stored in the influxDB by the KPIMON xApp.
+#. QP Driver xApp transmits prediction request to QoE Prediction assist xApp.
+#. QoE Prediction assist xApp builds prediction request message and then sends prediction request to MLxApp.
#. QoE Prediction assist xApp receives the result of prediction from MLxApp.
#. QoE Prediction assist xApp transmits the received prediction result to Traffic Sterring xApp.
Expected Input
--------------
-QoE Prediction assist xApp expects the following message along with the `TS_UE_LIST` message type through RMR.
+QoE Prediction assist xApp expects the following message along with the `TS_QOE_PRED_REQ` message type through RMR.
.. code-block:: none
-{"UEPredictionSet": ["Car-1"]}
+ {
+ PredictionUE: "12345",
+ UEMeasurement: {
+ ServingCellID: "310-680-200-555002",
+ MeasTimestampUEPDCPBytes: "2020-03-18 02:23:18.220",
+ MeasPeriodUEPDCPBytes: 20,
+ UEPDCPBytesDL: 2500000,
+ UEPDCPBytesUL: 1000000,
+ MeasTimestampUEPRBUsage: "2020-03-18 02:23:18.220",
+ MeasPeriodUEPRBUsage: 20,
+ UEPRBUsageDL: 10,
+ UEPRBUsageUL: 30,
+ },
+ CellMeasurements: [
+ {
+ CellID: "310-680-220-555001",
+ MeasTimestampPDCPBytes: "2020-03-18 02:23:18.220",
+ MeasPeriodPDCPBytes: 20,
+ PDCPBytesDL: 250000,
+ PDCPBytesUL: 100000,
+ MeasTimestampAvailPRB: "2020-03-18 02:23:18.220",
+ MeasPeriodAvailPRB: 20,
+ AvailPRBDL: 30,
+ AvailPRBUL: 50,
+ MeasTimestampRF: "2020-03-18 02:23:18.220",
+ MeasPeriodRF: 40,
+ RFMeasurements: data.RFMeasurement{RSRP: -90, RSRQ: -13, RSSINR: -2.5},
+ },
+ {
+ CellID: "310-680-220-555003",
+ MeasTimestampPDCPBytes: "2020-03-18 02:23:18.220",
+ MeasPeriodPDCPBytes: 20,
+ PDCPBytesDL: 200000,
+ PDCPBytesUL: 120000,
+ MeasTimestampAvailPRB: "2020-03-18 02:23:18.220",
+ MeasPeriodAvailPRB: 20,
+ AvailPRBDL: 60,
+ AvailPRBUL: 80,
+ MeasTimestampRF: "2020-03-18 02:23:18.220",
+ MeasPeriodRF: 40,
+ RFMeasurements: data.RFMeasurement{RSRP: -140, RSRQ: -17, RSSINR: -6},
+ },
+ {
+ CellID: "310-680-220-555002",
+ MeasTimestampPDCPBytes: "2020-03-18 02:23:18.220",
+ MeasPeriodPDCPBytes: 20,
+ PDCPBytesDL: 190000,
+ PDCPBytesUL: 100000,
+ MeasTimestampAvailPRB: "2020-03-18 02:23:18.220",
+ MeasPeriodAvailPRB: 20,
+ AvailPRBDL: 30,
+ AvailPRBUL: 45,
+ MeasTimestampRF: "2020-03-18 02:23:18.220",
+ MeasPeriodRF: 40,
+ RFMeasurements: data.RFMeasurement{RSRP: -115, RSRQ: -16, RSSINR: -5},
+ }]
+ }
Expected Output
Overview
--------
-- The entire operation scenario can be checked when deployed with KPIMON xApp, Traffic Sterring xApp.
+- The entire operation scenario can be checked when deployed with KPIMON xApp, Traffic Steering xApp and QP Driver xApp.
- This is compatible with influxDB2.
Build Image
-----------
-Use the `build_images.sh` script for docker image build.
-We can change the name and tag of an image by changing the variables in the script.
+Use the `docker build` command for docker image build.
.. code-block:: none
-qp-aimlfw $ docker build -f Dockerfile .
-
-Setting up curl (7.68.0-1ubuntu2.14) ...
-Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
-Processing triggers for ca-certificates (20211016ubuntu0.20.04.1) ...
-Updating certificates in /etc/ssl/certs...
-0 added, 0 removed; done.
-Running hooks in /etc/ca-certificates/update.d...
-done.
-Removing intermediate container 694003ecb2e1
----> 18d14cdf7365
-Step 15/19 : COPY --from=builder /opt/qoe-aiml-assist/build/qoe-aiml-assist .
----> 20d6be2c65b1
-Step 16/19 : COPY --from=builder /usr/local/include /usr/local/include
----> e5f0c6465df4
-Step 17/19 : COPY --from=builder /usr/local/lib /usr/local/lib
----> 5bcaca789e8c
-Step 18/19 : COPY --from=builder /opt/qoe-aiml-assist/config/* /opt/ric/config/
----> a5ef330d90df
-Step 19/19 : RUN ldconfig
----> Running in b6ee4f81f4ff
-Removing intermediate container b6ee4f81f4ff
----> 91d0473a7cf1
-Successfully built 91d0473a7cf1
-Successfully tagged nexus3.o-ran-sc.org:10004/o-ran-sc/ric-app-qp-aimlfw-docker:1.0.0
+ qp-aimlfw $ docker build -f Dockerfile .
+
+ Setting up curl (7.68.0-1ubuntu2.14) ...
+ Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
+ Processing triggers for ca-certificates (20211016ubuntu0.20.04.1) ...
+ Updating certificates in /etc/ssl/certs...
+ 0 added, 0 removed; done.
+ Running hooks in /etc/ca-certificates/update.d...
+ done.
+ Removing intermediate container 694003ecb2e1
+ ---> 18d14cdf7365
+ Step 15/19 : COPY --from=builder /opt/qoe-aiml-assist/build/qoe-aiml-assist .
+ ---> 20d6be2c65b1
+ Step 16/19 : COPY --from=builder /usr/local/include /usr/local/include
+ ---> e5f0c6465df4
+ Step 17/19 : COPY --from=builder /usr/local/lib /usr/local/lib
+ ---> 5bcaca789e8c
+ Step 18/19 : COPY --from=builder /opt/qoe-aiml-assist/config/* /opt/ric/config/
+ ---> a5ef330d90df
+ Step 19/19 : RUN ldconfig
+ ---> Running in b6ee4f81f4ff
+ Removing intermediate container b6ee4f81f4ff
+ ---> 91d0473a7cf1
+ Successfully built 91d0473a7cf1
+ Successfully tagged nexus3.o-ran-sc.org:10004/o-ran-sc/ric-app-qp-aimlfw-docker:1.0.0
Environments of qp-aimlfw
By modifying the `config/config-file.json` file before onboarding, we can change the environment variable of the QoE Prediction assist xApp.
Below is a description of the configurable environmental variables related to QoE xApp.
-`INFLUX_URL` : URL contianing the address and port of influxDB. ex) "http://127.0.0.1:8086"
-`INFLUX_TOKEN` : a influx token composed of alphabets and numbers.
-`INFLUX_BUCKET` : a bucket name of influxDB.
-`INFLUX_ORG` : organization name of influxDB.
-`INFLUX_QUERY_START` : start point of the influxDB query range ex) "-3m" or "-10s"
-`INFLUX_QUERY_STOP` : end point of the influxDB query range. If this value is not set like `""`, the end point is set to the current time(now). ex) "-1m" or ""
-`MLXAPP_REQ_HEADER_HOST` : header of MLxApp's host. ex) "qoe-model.kserve-test.example.com"
-`MLXAPP_HOST` : host address of MLxApp. ex) "http://127.0.0.1"
-`MLXAPP_PORT` : port number of MLxApp. ex) "2222"
-`MLXAPP_REQ_URL` : requet URL of MLxapp. ex) "v1/models/qoe-model:predict"
++------------------------+--------------------------------------------------------------------------------+
+|`INFLUX_URL` | URL contianing the address and port of influxDB. ex) "http://127.0.0.1:8086" |
++------------------------+--------------------------------------------------------------------------------+
+|`INFLUX_TOKEN` |a influx token composed of alphabets and numbers. |
++------------------------+--------------------------------------------------------------------------------+
+|`INFLUX_BUCKET` | a bucket name of influxDB. |
++------------------------+--------------------------------------------------------------------------------+
+|`INFLUX_ORG` | organization name of influxDB. |
++------------------------+--------------------------------------------------------------------------------+
+|`INFLUX_QUERY_START` | start point of the influxDB query range ex) "-3m" or "-10s" |
++------------------------+--------------------------------------------------------------------------------+
+|`INFLUX_QUERY_STOP` | end point of the influxDB query range. If this value is not set like `""`, |
+| | the end point is set to the current time(now). ex) "-1m" or "" |
++------------------------+--------------------------------------------------------------------------------+
+|`MLXAPP_REQ_HEADER_HOST`| header of MLxApp's host. ex) "qoe-model.kserve-test.example.com" |
++------------------------+--------------------------------------------------------------------------------+
+|`MLXAPP_HOST` | host address of MLxApp. ex) "http://127.0.0.1" |
++------------------------+--------------------------------------------------------------------------------+
+|`MLXAPP_PORT` | port number of MLxApp. ex) "2222" |
++------------------------+--------------------------------------------------------------------------------+
+|`MLXAPP_REQ_URL` |requet URL of MLxapp. ex) "v1/models/qoe-model:predict" |
++------------------------+--------------------------------------------------------------------------------+
Onboarding of qp-aimlfw using `dms_cli` tool
.. code-block:: none
-$ dms_cli onboard --config_file_path=config/config-file.json --schema_file_path=config/schema.json
+ $ dms_cli onboard --config_file_path=config/config-file.json --schema_file_path=config/schema.json
-httpGet:
-path: '{{ index .Values "readinessProbe" "httpGet" "path" | toJson }}'
-port: '{{ index .Values "readinessProbe" "httpGet" "port" | toJson }}'
-initialDelaySeconds: '{{ index .Values "readinessProbe" "initialDelaySeconds" | toJson }}'
-periodSeconds: '{{ index .Values "readinessProbe" "periodSeconds" | toJson }}'
+ httpGet:
+ path: '{{ index .Values "readinessProbe" "httpGet" "path" | toJson }}'
+ port: '{{ index .Values "readinessProbe" "httpGet" "port" | toJson }}'
+ initialDelaySeconds: '{{ index .Values "readinessProbe" "initialDelaySeconds" | toJson }}'
+ periodSeconds: '{{ index .Values "readinessProbe" "periodSeconds" | toJson }}'
-httpGet:
-path: '{{ index .Values "livenessProbe" "httpGet" "path" | toJson }}'
-port: '{{ index .Values "livenessProbe" "httpGet" "port" | toJson }}'
-initialDelaySeconds: '{{ index .Values "livenessProbe" "initialDelaySeconds" | toJson }}'
-periodSeconds: '{{ index .Values "livenessProbe" "periodSeconds" | toJson }}'
+ httpGet:
+ path: '{{ index .Values "livenessProbe" "httpGet" "path" | toJson }}'
+ port: '{{ index .Values "livenessProbe" "httpGet" "port" | toJson }}'
+ initialDelaySeconds: '{{ index .Values "livenessProbe" "initialDelaySeconds" | toJson }}'
+ periodSeconds: '{{ index .Values "livenessProbe" "periodSeconds" | toJson }}'
-{
-"status": "Created"
-}
+ {
+ "status": "Created"
+ }
Deployment of qp-aimlfw using `dms_cli` tool
.. code-block:: none
-$ dms_cli install --xapp_chart_name=qoe-aiml-assist --version=1.0.0 --namespace=ricxapp
+ $ dms_cli install --xapp_chart_name=qoe-aiml-assist --version=1.0.0 --namespace=ricxapp
-status: OK
+ status: OK
-Check if QoE Prediction assist xApp deployed normally.
+ Check if QoE Prediction assist xApp deployed normally.
.. code-block:: none
-$ kubectl get pods -n ricxapp
-NAME READY STATUS RESTARTS AGE
-ricxapp-qoe-aiml-assist-5f788bb667-47k5h 0/1 Pending 0 3m
+ $ kubectl get pods -n ricxapp
+ NAME READY STATUS RESTARTS AGE
+ ricxapp-qoe-aiml-assist-5f788bb667-47k5h 0/1 Pending 0 3m
-$ kubectl get svc -n=ricxapp
-NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
-aux-entry ClusterIP 10.106.133.25 <none> 80/TCP,443/TCP 8d
-service-ricxapp-qoe-aiml-assist-http ClusterIP 10.96.95.160 <none> 8080/TCP 129m
-service-ricxapp-qoe-aiml-assist-rmr ClusterIP 10.107.182.86 <none> 4560/TCP,4561/TCP 129m
+ $ kubectl get svc -n=ricxapp
+ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+ aux-entry ClusterIP 10.106.133.25 <none> 80/TCP,443/TCP 8d
+ service-ricxapp-qoe-aiml-assist-http ClusterIP 10.96.95.160 <none> 8080/TCP 129m
+ service-ricxapp-qoe-aiml-assist-rmr ClusterIP 10.107.182.86 <none> 4560/TCP,4561/TCP 129m