AIML/표준

[Test] Model Management Service (MMES) Standalone 설치 & 테스트 전체 과정 정리

zhuxiclover 2025. 9. 3. 17:03
⚡ User Guid : https://github.com/o-ran-sc/aiml-fw-awmf-modelmgmtservice/blob/master/docs/user-guide.rst
 

aiml-fw-awmf-modelmgmtservice/docs/user-guide.rst at master · o-ran-sc/aiml-fw-awmf-modelmgmtservice

Mirror of the aiml-fw/awmf/modelmgmtservice repo. Contribute to o-ran-sc/aiml-fw-awmf-modelmgmtservice development by creating an account on GitHub.

github.com

 


1. 준비 단계

   • Go 설치 필요 (문서 prerequisite)

   -  최신 Go(1.24.6) 수동 설치

cd /tmp
wget https://go.dev/dl/go1.24.6.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.24.6.linux-amd64.tar.gz
echo 'export PATH="$PATH:/usr/local/go/bin"' >> ~/.bashrc
source ~/.bashrc
go version   # go1.24.6 확인

2. 소스 코드 다운로드 & 빌드

git clone "https://gerrit.o-ran-sc.org/r/aiml-fw/awmf/modelmgmtservice.git"
cd modelmgmtservice
go get
go build -o mme_bin .

 

➡ mme_bin 실행 파일 생성됨


3. config.env 환경변수 세팅

3-1. S3 (MinIO) 연동 이슈

  • 기본 config.env는 S3 key/secret이 비어 있어서 실행 시 에러 발생

error="invalid config data
s3_access_key is not set/available or empty

 

 

   • 해결

     - AIMLFW 설치 시 포함된 Kubeflow MinIO 활용

     - kubectl get secret -A | grep -i minio → mlpipeline-minio-artifact 발견

     - secret 확인

       ➡ accesskey = leofs / secretkey = RQXM9lvM 획득, 이 값을 config.env에 기입

kubectl -n kubeflow get secret mlpipeline-minio-artifact \
  -o jsonpath='{.data.accesskey}' | base64 -d; echo
kubectl -n kubeflow get secret mlpipeline-minio-artifact \
  -o jsonpath='{.data.secretkey}' | base64 -d; echo

 

 

3-2. MinIO 접근 이슈

  • 서비스는 ClusterIP(9000/TCP)라 외부 접근 불가, kubeflow의 MinIO 서비스(minio-service)가 ClusterIP 타입이라, 노드 외부에서 32080 포트로 접근할 수 없었음

# 에러 코드
ERROR Unable to initialize new alias from the provided credentials. The specified key does not exist.

 

   해결 : NodePort로 수정하고 원하는 포트를 열어줌

     -  이제 http://127.0.0.1:32081로 접근 가능해짐, 이후 mc alias set local http://127.0.0.1:32081 leofs RQXM9lvM 성공

kubectl -n kubeflow patch svc minio-service -p '{"spec":{"type":"NodePort"}}'
kubectl -n kubeflow patch svc minio-service -p '{"spec":{"ports":[{"port":9000,"protocol":"TCP","targetPort":9000,"nodePort":32081}]}}'

  

   확인

curl http://127.0.0.1:32081/minio/health/ready
# → HTTP/1.1 200 OK

 

 

3-3. MinIO 클라이언트 (mc) 설치 및 테스트

wget -q https://dl.min.io/client/mc/release/linux-amd64/mc -O /tmp/mc
chmod +x /tmp/mc && sudo mv /tmp/mc /usr/local/bin/mc
mc alias set local http://127.0.0.1:32081 leofs RQXM9lvM
mc mb local/aimlfw-models   # 기본 버킷 생성

 

 

3-4. config.env 최종본

MMES_URL=0.0.0.0:8083

S3_URL=http://127.0.0.1:32081
S3_ACCESS_KEY=leofs
S3_SECRET_KEY=RQXM9lvM
S3_REGION=ap-northeast-2

s3_endpoint=${S3_URL}
s3_access_key=${S3_ACCESS_KEY}
s3_secret_key=${S3_SECRET_KEY}
s3_region=${S3_REGION}
s3_bucket=aimlfw-models
s3_use_ssl=false

MODEL_FILE_POSTFIX=_model.zip
INFO_FILE_POSTFIX=_info.json
LOG_FILE_NAME=mmes.log

PG_USER=mmes
PG_PASSWORD=mmes123
PG_HOST=127.0.0.1
PG_PORT=5432
PG_DBNAME=mmesdb

 

 


4. Postgres DB 설정

 • 처음엔 DB 필드가 비어 있어 실행 에러 발생

invalid port (strconv.ParseUint: parsing "sslmode=disable": invalid syntax)

 

 • 해결 : 로컬 Progres 실행 (Docker)

docker run -d --name mme-postgres \
  -e POSTGRES_USER=mmes \
  -e POSTGRES_PASSWORD=mmes123 \
  -e POSTGRES_DB=mmesdb \
  -p 5432:5432 postgres:15

 

 • config.env에 DB 설정 반영 후 정상 연결 확인

 


5. 서비스 실행

 • 로그에 Starting api ... 출력 → API 서버 기동 성공

set -a
source ./config.env
set +a
./mme_bin

 

 • ./mme_bin 실행 시

# 밑의 에러 발생
failed to initialize database, got error cannot parse `host= user= password= dbname= port= sslmode=disable`

 

 • 원인 : config.env에서 DB 환경 변수를 소문자 (pg_user, pg_host)로 작성했는데, 실제 코드에서는 대문자 (PG_USER, PG_HOST)를 찾고 있었음, 그래서 값이 비어있다고 인식함

 

 • 해결 : conifg.env에 대문자로 수정

PG_USER=mmes
PG_PASSWORD=mmes123
PG_HOST=127.0.0.1
PG_PORT=5432
PG_DBNAME=mmesdb

 

 

 


6. API 테스트 (T.S 포함)

6-1. 모델 등록

 • 문서 예제 (model-name, rapp-id) 그대로 사용 → 400 Bad Request

 • 해결 : 실제 코드가 요구하는 JSON 구조 확인 (코드에서 요구하는 스키마는 ModelID, Description, ModelInformation 등 계층 구조가 필요) ModelID 루트 구조 사용

 

 • 최종 JSON (qos-301.json)

{
  "ModelId": {
    "ModelName": "qos-301",
    "ModelVersion": "1.0"
  },
  "Description": "QoS prediction model",
  "ModelInformation": {
    "Metadata": {
      "Author": "juhee",
      "Accuracy": "90",
      "ModelType": "timeseries",
      "FeatureList": ["pdcpBytesDl", "pdcpBytesUl"]
    },
    "InputDataType": "float32",
    "OutputDataType": "float32"
  }
}

 

 • 등록

   201 Created

curl -i -H "Content-Type: application/json" -X POST \
  -d @qos-301.json \
  http://127.0.0.1:8083/ai-ml-model-registration/v1/model-registrations

 

 

6-2. 모델 조회

 • 초기에 NoSuchBucket 에러 → mc mb local/qos-301로 버킷 수동 생성 후 해결

curl -X GET http://127.0.0.1:8083/ai-ml-model-registration/v1/getModelInfo/qos-301

 

 

 

 

6-3. 모델 업로드

echo "dummy model file" > model.txt
zip model.zip model.txt
curl -F "file=@model.zip" \
  http://127.0.0.1:8083/ai-ml-model-registration/v1/uploadModel/qos-301/1.0/1
# → {"code":200,"message":"Model uploaded successfully.."}

 

 

 

6-4. 모델 다운로드

 • 정상 다운로드 확인

curl -X GET \
  http://127.0.0.1:8083/ai-ml-model-registration/v1/downloadModel/qos-301/1.0/1/model.zip \
  --output downloaded_model.zip

 


✔  업로드 된 모델 확인 (MinIO에서 직접 보기)

 • 실제 model.zip 파일이 들어있는 것 확인 가능

mc ls local/qos-301
mc ls local/qos-301/1.0/1/