Intro

<aside> 🔥

가설을 세우고 어디가 문제인지 확인합니다.

</aside>

상황

coremltools로 변환한 .mlpackage 파일을 Xcode에 파일을 옮기면 알아서 컴파일이 되는데 컴파일한 .mlmodelc 파일 내에 manifest.json이 포함되지 않아 모델을 읽는 과정에서 오류가 발생함.

이때, 모델 경로를 불러오는 방법은 Bundle을 이용해서 불러옴. Bundle은 Xcode 프로젝트 내에 json 등 파일들을 저장하는 경로

bundleModelURL = Bundle.main.url(
                forResource: modelNameOrPath, withExtension: "mlmodelc")
            {

Body

현상 1 - 로컬 경로로 읽으면 모델을 불러올 수 있음

let absolutePath = "/Users/seonjong/workspace/challenge_4/MyModelTest/MyModelTest/mymodel_250727.mlpackage"
if FileManager.default.fileExists(atPath: absolutePath) {
		modelURL = URL(fileURLWithPath: absolutePath)

현상 2 - coremltools 버전에 따라 동일 코드더라도 .mlpackage로 변환이 가능할때가 있고 불가능할때가 있음

명확한 버전 명시가 안되어 있어서 어떤 버전이 가능한지 확인이 어려움

가설들

가설 1) Xcode가 이상하다. Xcode를 삭제하고 다시 깔아서 진행해보자.

문제 아님. 여전히 에러 발생

스크린샷 2025-07-27 오후 5.58.45.png

가설 2) 정확한 coremltools 버전으로 변환한 Open Efficient Model을 번들로 추가하면 manifest.json이 그대로 존재한다.

→ 동일한 문제 발생

스크린샷 2025-07-27 오후 6.42.39.png

가설 3) coremltools가 잘못됐다. createML을 이용해서 모델을 만들어야 한다. X

이건 아닌듯.. 모델 패키지가 동일함. 심지어 createML은 mlmodel이라서 옛날 확장자임

가설 4) 그냥 뭔 문제인지 모르겠는데 컴파일이 잘못되고 있다. X

xcrun coremlcompiler compile ./OpenELM-270M-Instruct.mlpackage ./OpenELM-270M-Instruct.modelc

위 명령어로 컴파일하면 아래와 같이 파일이 떨어짐

.
└── OpenELM-270M-Instruct.mlmodelc
    ├── analytics
    │   └── coremldata.bin
    ├── coremldata.bin
    ├── metadata.json
    ├── model.mil
    └── weights
        └── weight.bin

4 directories, 5 files

여기에 어디에도 Manifest.json이 없음

그런데 Xcode에서는 계속해서 Manifest.json을 찾고 있음. 왜 이러는지 ㄹㅇ 모르겠음

해결책 찾았다!!!

<aside> 🔥

진짜 Apple 좀 맞아야겠다.

</aside>

공식문서를 봅시다.

load(contentsOf:configuration:completionHandler:)

Creates a Core ML model instance asynchronously from a compiled model file, a custom configuration, and a completion handler.

iOS 14.0+iPadOS 14.0+Mac Catalyst 14.0+macOS 11.0+tvOS 14.0+visionOS 1.0+watchOS 7.0+

class func load(
    contentsOf url: [URL](<https://developer.apple.com/documentation/Foundation/URL>),
    configuration: [MLModelConfiguration](<https://developer.apple.com/documentation/coreml/mlmodelconfiguration>) = MLModelConfiguration(),
    completionHandler handler: @escaping ([Result](<https://developer.apple.com/documentation/Swift/Result>)<[MLModel](<https://developer.apple.com/documentation/coreml/mlmodel>), any [Error](<https://developer.apple.com/documentation/Swift/Error>)>) -> [Void](<https://developer.apple.com/documentation/Swift/Void>)
)

Parameters

여기서 공식문서에 URL은 분명히 typically with the URL that compileModel(at:) returns. 라고 적혀있다. 그래서 그렇게 했다.

그런데 위처럼 하면 오히려 에러가 발생한다.

let bundleModelURL = Bundle.main.url(
                forResource: modelNameOrPath, withExtension: "mlmodelc")
let compiledModelURL = try await MLModel.compileModel(at: bundleModelURL!)
self.model = try MLModel(contentsOf: compiledModelURL!)
let bundleModelURL = Bundle.main.url(
                forResource: modelNameOrPath, withExtension: "mlmodelc")
self.model = try MLModel(contentsOf: modelURL!)

Conclusion

왜 이런 현상이 발생하는지는 잘 모르겠는데 아마 Xcode에서 build할때 이미 mlmodelc로 컴파일이 된 파일이 들어가버려서 굳이 MLModel.compileModel을 할 필요가 없는 것으로 추측된다. 진짜 팀쿡 머리 콕 박아버리고 싶네


⬅️ 이전 페이지

Swift의 토크나이저

➡️ 다음 페이지

MLC로 macOS에 LLM 실행하기

Reference

https://developer.apple.com/documentation/coreml/mlmodel/load(contentsof:configuration:completionhandler:)

<aside>

Topics

swiftly 설치하기

VSCode에서 swift 개발하기

swift type

언어 모델을 swift에 올리는 방법

Swift의 토크나이저

.mlpackage가 안올라가는 이슈

MLC로 macOS에 LLM 실행하기

</aside>