모델 저장하기 및 로드하기

TensorFlow.js는 Layers API로 생성되었거나 기존 TensorFlow 모델에서 변환된 모델을 저장하고 로드하는 기능을 제공합니다. 이러한 모델은 본인이 직접 훈련한 모델이거나 타인이 훈련한 모델일 수 있습니다. Layers API를 사용 시 얻을 수 있는 주요 이점은 만든 모델을 직렬화할 수 있다는 점이며 해당 내용을 이 튜토리얼에서 살펴보고자 합니다.

이 튜토리얼은 TensorFlow.js 모델(JSON 파일로 식별 가능) 저장 및 로드에 중점을 둡니다. TensorFlow Python 모델을 가져올 수도 있습니다. 이러한 모델 로드는 다음 두 가지 튜토리얼에서 다루고 있습니다.

tf.Model 저장하기

tf.Modeltf.Sequential 모두 모델의 토폴로지가중치를 저장할 수 있는 model.save 함수를 제공합니다.

  • 토폴로지: 모델의 아키텍처(즉, 사용하는 연산)를 설명하는 파일입니다. 해당 파일은 외부에 저장된 모델의 가중치에 대한 참조를 포함합니다.

  • 가중치: 주어진 모델의 가중치를 효율적인 형식으로 저장하는 바이너리 파일입니다. 일반적으로 토폴로지와 같은 폴더에 저장됩니다.

모델을 저장하는 코드가 어떻게 보이는지 살펴보겠습니다.

const saveResult = await model.save('localstorage://my-model-1');

다음은 몇 가지 유의 사항입니다.

  • save 메서드는 scheme로 시작하는 URL과 유사한 문자열 인수를 사용하며 이는 모델을 저장하려는 대상 유형을 설명합니다. 위의 예에서 체계는 localstorage://입니다.
  • 체계 뒤에는 경로가 있습니다. 위의 예에서 경로는 my-model-1입니다.
  • save 메서드는 비 동기식입니다.
  • model.save의 반환 값은 모델 토폴로지 및 가중치의 바이트 크기와 같은 정보를 전달하는 JSON 객체입니다.
  • 모델을 저장하는 데 사용되는 환경은 모델을 로드할 수 있는 환경에 영향을 주지 않습니다. node.js에 모델을 저장해도 저장된 모델이 브라우저에 로드되는 것을 막지는 않습니다.

아래에서 사용 가능한 다양한 체계를 살펴보겠습니다.

로컬 저장소(브라우저 전용)

체계: localstorage://

await model.save('localstorage://my-model');

브라우저의 로컬 저장소my-model이라는 이름으로 모델이 저장됩니다. 공간이 문제가 되는 경우 사용자 또는 브라우저 자체가 로컬 저장소를 비울 수 있지만, 이는 새로 고침간에 계속 유지됩니다. 또한 각 브라우저는 특정 도메인의 로컬 저장소에 저장할 수 있는 데이터양에 대한 자체 제한을 설정합니다.

IndexedDB(브라우저 전용)

체계: indexeddb://

await model.save('indexeddb://my-model');

모델이 브라우저의 IndexedDB 저장소에 저장됩니다. 로컬 저장소와 마찬가지로 새로 고침 사이에 유지되지만, 이는 저장된 객체의 크기에 더 큰 제한을 주게 됩니다.

파일 다운로드(브라우저 전용)

체계: downloads://

await model.save('downloads://my-model');

브라우저가 모델 파일을 사용자의 컴퓨터로 다운로드합니다. 두 개의 파일이 생성됩니다.

  1. [my-model].json 이라는 텍스트 JSON 파일(아래 설명된 가중치 파일에 대한 토폴로지 및 참조를 전달함)
  2. [my-model].weights.bin 이라는 가중치 값을 전달하는 바이너리 파일

[my-model] 이름을 변경하여 다른 이름의 파일을 가져올 수 있습니다.

.json 파일은 상대 경로를 사용하여 .bin 파일을 가리키므로 두 파일은 같은 폴더에 있어야 합니다.

참고: 일부 브라우저에서는 두 개 이상의 파일을 동시에 다운로드하기 전에 사용자에게 권한을 부여해야 합니다.

HTTP(S) 요청

체계: http:// 또는 https://

await model.save('http://model-server.domain/upload')

모델을 리모트 서버에 저장하도록 웹 요청이 생성됩니다. 요청이 처리될 수 있도록 사용자가 리모트 서버를 제어해야 합니다.

모델은 POST 요청을 통해 지정된 HTTP 서버로 전송됩니다. POST의 본문은 multipart/form-data 형식이며 두 개의 파일로 구성됩니다.

  1. model.json 이라는 텍스트 JSON 파일(아래 설명된 가중치 파일에 대한 토폴로지 및 참조를 전달함)
  2. model.weights.bin 이라는 가중치 값을 전달하는 바이너리 파일

두 파일의 이름은 항상 위에 지정된 것과 정확히 일치합니다(이름은 함수에 내장됨). 이 api 문서에는 플라스크 웹 프레임워크를 사용하여 save에서 시작된 요청을 처리하는 방법을 보여주는 Python 코드 조각이 포함되어 있습니다.

더 많은 인수 또는 요청 헤더를 HTTP 서버에 전달해야 하는 경우가 종종 있습니다(예: 인증하거나 모델을 저장해야 하는 폴더를 지정하려는 경우). 요청의 이런 측면도 tf.io.browserHTTPRequest의 URL 문자열 인수를 대체하여 save에서 세밀하게 제어할 수 있습니다. 이 API는 HTTP 요청을 제어하는 데 더 큰 유연성을 제공합니다.

아래 예제를 봅시다.

await model.save(tf.io.browserHTTPRequest(
    'http://model-server.domain/upload',
    {method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));

네이티브 파일 시스템(Node.js만 해당)

체계: file://

await model.save('file:///path/to/my-model');

Node.js에서 실행할 때 파일 시스템에 직접 액세스할 수 있으며 모델을 저장할 수 있습니다. 위의 명령은 scheme에 따라 지정된 path에 두 개의 파일을 저장합니다.

  1. [model].json 이라는 텍스트 JSON 파일(아래 설명된 가중치 파일에 대한 토폴로지 및 참조를 전달함)
  2. [model].weights.bin 이라는 가중치 값을 포함하는 바이너리 파일

두 파일의 이름은 항상 위에 지정된 것과 정확히 일치합니다(이름은 함수에 내장됨).

tf.Model 로드하기

위의 방법 중 하나를 사용하여 저장된 모델이 주어지면 tf.loadLayersModel API를 사용하여 로드할 수 있습니다.

모델을 로드하는 코드가 어떻게 보이는지 살펴보겠습니다.

const model = await tf.loadLayersModel('localstorage://my-model-1');

다음은 몇 가지 유의 사항입니다.

  • 마찬가지로 model.save()loadLayersModel 함수는 체계와 시작하는 URL과 같은 문자열 인수를 취하며, 모델을 로드하려는 대상 유형을 설명합니다.
  • 체계 뒤에는 경로가 있습니다. 위의 예에서 경로는 my-model-1입니다.
  • URL과 유사한 문자열은 IOHandler 인터페이스와 일치하는 객체로 대체될 수 있습니다.
  • tf.loadLayersModel() 함수는 비 동기식입니다.
  • tf.loadLayersModel의 반환 값은 tf.Model입니다.

아래에서 사용 가능한 다양한 체계를 살펴보겠습니다.

로컬 저장소(브라우저 전용)

체계: localstorage://

const model = await tf.loadLayersModel('localstorage://my-model');

브라우저의 로컬 저장소에서 my-model 이라는 모델이 로드됩니다.

IndexedDB(브라우저 전용)

체계: indexeddb://

const model = await tf.loadLayersModel('indexeddb://my-model');

브라우저의 IndexedDB 저장소에서 모델이 로드됩니다.

HTTP(S)

체계: http:// 또는 https://

const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');

http 엔드 포인트에서 모델을 로드합니다. json 파일을 로드한 후 함수는 json 파일이 참조하는 해당 .bin 파일을 요청합니다.

참고: 이 구현 방식은 fetch 메서드의 존재에 의존합니다. 기본적으로 fetch 메서드를 제공하지 않는 환경에 있는 경우 해당 인터페이스를 충족하는 전역 메서드 이름 fetch를 제공하거나 (node-fetch)와 같은 라이브러리를 사용할 수 있습니다. [https://www.npmjs.com/package/node-fetch]

네이티브 파일 시스템(Node.js만 해당)

체계: file://

const model = await tf.loadLayersModel('file://path/to/my-model/model.json');

Node.js에서 실행할 때 파일 시스템에 직접 액세스할 수 있으며 여기에서 모델을 로드 할 수 있습니다. 위의 함수 호출에서 model.json 파일 자체를 참조합니다(저장할 때 폴더를 지정함). 해당 .bin 파일은 json 파일과 같은 폴더에 있어야 합니다.

IOHandlers로 모델 로드하기

위의 체계에서 요구가 충족되지 않은 경우 IOHandler를 사용하여 사용자 정의 로드 동작을 구현할 수 있습니다. TensorFlow.js가 제공하는 IOHandler 중 하나는 브라우저 사용자가 브라우저에서 모델 파일을 업로드할 수 있게 해주는 tf.io.browserFiles입니다. 자세한 내용은 설명서를 참조하세요.

사용자 정의 IOHandlers로 모델 저장하기 및 로드하기

위의 체계에서 로드 또는 저장 요구가 충족되지 않은 경우 IOHandler를 구현하여 사용자 정의 직렬화 동작을 구현할 수 있습니다.

IOHandlersaveload 메서드가 있는 객체입니다.

save 함수는 ModelArtifacts 인터페이스와 일치하는 하나의 매개변수를 취하며 SaveResult 객체로 확인되는 프라미스를 반환해야 합니다.

load 함수는 매개변수를 사용하지 않으며 ModelArtifacts 객체로 확인되는 프라미스를 반환해야 합니다. 이 객체는 save에 전달되는 것과 같은 객체입니다.

IOHandler를 구현하는 방법은 BrowserHTTPRequest의 예제를 참조하세요.