아래 문서는 플랫폼에서 더 이상 사용이 권장되지 않는 foundry_ml
라이브러리를 설명합니다. 대신 palantir_models
라이브러리를 사용하세요.
foundry_ml
라이브러리는 2025년 10월 31일에 제거될 예정으로, Python 3.9의 예정된 폐기와 일치합니다.
spaCy는 고급 자연어 처리(NLP)를 위한 인기 있는 오픈소스 소프트웨어 라이브러리입니다. 이 예제는 foundry_ml
스테이지 레지스트리에 spaCy 모델을 등록하는 과정을 안내합니다. 이 코드는 spaCy 웹사이트의 Customizing spaCy’s Tokenizer class 예제를 따르며, 기명 개체 인식 모델을 활용합니다.
이 튜토리얼은 Foundry의 모델 통합의 기본 구성 요소를 기반으로 하며, 다음 사항에 익숙하다고 가정합니다:
foundry_ml
스테이지 레지스트리에 사용자 정의 스테이지를 추가하는 방법에 대한 이해. 추가 라이브러리 지원 추가 문서를 참조하세요. 이 튜토리얼은 해당 문서에서 자세히 설명한 대부분의 단계를 구현합니다.이 튜토리얼은 사전 학습된 spaCy 언어 모델이 작성 환경에서 사용 가능하다고 가정합니다. 사용 가능하지 않은 경우 오픈소스 콘다 채널을 통해 접근을 허용하거나 개인 콘다 채널을 설정하여 작성 환경에서 사용할 수 있게 할 수 있습니다. 팔란티어 담당자에게 문의하십시오.
데이터프레임의 "text" 열에 모델을 적용하는 모델을 생성하려고 합니다. 이를 위해 변환 함수, 직렬화기, 역직렬화기를 등록하는 래퍼 클래스인 SpacyNERModel
을 정의해야 합니다. 이 모든 장식된 함수들은 Foundry가 모델을 올바르게 직렬화하고 실행할 수 있도록 필요합니다.
가장 먼저 "파이썬 라이브러리" 유형의 새로운 Code Repositories를 생성하고 프로젝트 구조를 설정합니다. 이 예제에서는 spacy-custom-ner-stage
리포지토리를 생성하고 spacy_custom_stage
폴더에 두 개의 파이썬 파일인 model.py
와 model_class_registry.py
를 추가합니다. 아래에 정의된 코드를 두 파일로 분리할 필요는 없지만, 여기서는 개념적으로 더 깔끔한 구분을 제공하기 위해 이렇게 했습니다.
├── conda_recipe # conda 패키지 생성을 위한 레시피 폴더
│ └── meta.yaml # 패키지 메타데이터를 정의하는 yaml 파일
├── settings.gradle # 프로젝트 설정을 정의하는 gradle 파일
├── src # 소스 코드 폴더
│ ├──spacy_custom_stage # spacy에 대한 사용자 정의 단계 코드가 있는 폴더
│ │ ├── __init__.py # 패키지 초기화 파일
│ │ └── model.py # 모델 정의 파일
│ │ └── model_class_registry.py # 모델 클래스 등록 파일
│ ├── setup.cfg # 프로젝트 설정을 담고 있는 설정 파일
│ └── setup.py # 패키지 설치 스크립트
└── README.md # 프로젝트에 대한 설명이 담긴 readme 파일
model.py
파일에서, 우리는 spaCy 튜토리얼을 따라 커스텀 토크나이저를 작성하고 새로운 모델 클래스를 정의할 것입니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
import spacy from spacy.tokenizer import Tokenizer # 사용자 정의 토크나이저 생성 def custom_tokenizer(nlp): import re # 특수 경우 special_cases = {":)": [{"ORTH": ":)"}]} # 접두사 정규식 prefix_re = re.compile(r'''^[[("']''') # 접미사 정규식 suffix_re = re.compile(r'''[])"']$''') # 중간 문자 정규식 infix_re = re.compile(r'''[-~]''') # 간단한 URL 정규식 simple_url_re = re.compile(r'''^https?://''') return Tokenizer(nlp.vocab, rules=special_cases, prefix_search=prefix_re.search, suffix_search=suffix_re.search, infix_finditer=infix_re.finditer, url_match=simple_url_re.match) # foundry_ml 레지스트리를 위한 래퍼 클래스 정의 class SpacyNERModel(): # 로드된 언어 모델을 입력으로 사용하고 사용자 정의 토크나이저 사용 def __init__(self, model_name): self.spacy = spacy.load(model_name) self.spacy.tokenizer = custom_tokenizer(self.spacy) # 로드된 SpaCy 모델을 사용하여 추출된 개체 반환 # 이 함수는 다른 NLP 작업을 수행하도록 조정할 수 있습니다. def predict(self, text): doc = self.spacy(text) results = [(ent.text, ent.start_char, ent.end_char, ent.label_) for ent in doc.ents] return results # 데이터 프레임에서 작동하는 예측 기능 정의, 데이터 프레임에 "text" 열이 존재한다고 가정 def predict_df(self, df): df["entities"] = df["text"].apply(self.predict) return df
model_class_registry.py
파일에서, serialize
, deserialize
, transform
함수를 구현할 것입니다.
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
import dill import os import tempfile # 새로 생성된 모델 클래스를 불러옴 from spacy_custom_stage.model import SpacyNERModel # Foundry 파이썬 함수를 불러옴 from foundry_ml.stage.flexible import stage_transform, register_stage_transform_for_class from foundry_ml.stage.serialization import deserializer, serializer, register_serializer_for_class from foundry_object.utils import safe_upload_file, download_file # 스테이지 간 모델과 데이터를 처리하는 함수를 주석 처리 @stage_transform() def _transform(model, df): return model.predict_df(df) # 이것을 호출하여 파이썬 스테이지 레지스트리에 전송하고, 기존 등록된 변환을 무시하려면 force=True를 사용 register_stage_transform_for_class(SpacyNERModel, _transform, force=True) # 디시리얼라이저 데코레이터 @deserializer("spacy_ner_model.dill", force=True) def _deserializer(filesystem, path): with tempfile.TemporaryDirectory() as tmpdir: local_path = os.path.join(tmpdir, "file.dill") download_file(filesystem, path, local_path) with open(local_path) as f: model = dill.load(f) return model # 시리얼라이저 데코레이터 @serializer(_deserializer) def _serializer(filesystem, value): path = 'spacy_ner_model.dill' with tempfile.NamedTemporaryFile() as tmp: dill.dump(value, tmp) safe_upload_file(filesystem, tmp.name, path, base64_encode=True) return path # 클래스에 시리얼라이저를 등록하려면 force=True를 사용하여 기존 등록된 시리얼라이저를 무시 register_serializer_for_class(SpacyNERModel, _serializer, force=True)
다음으로, 모든 적절한 패키지가 meta.yaml
파일에 추가되었는지 확인해야 합니다. 이 예제의 경우, 파일의 해당 섹션은 다음과 비슷하게 보일 것입니다:
# 패키지를 실행하기 위해 필요한 패키지들
run:
- python 3.8.* # 파이썬 3.8 버전
- spacy # 스페이시 패키지
- foundry_ml # Foundry ML 패키지
- dill # 딜 패키지
이제 우리가 방금 생성한 두 파일의 내용을 __init__.py
에 가져옵니다. 아래의 정확한 규칙을 따를 필요는 없습니다.
Copied!1 2 3 4 5 6 7 8
# spacy_custom_stage.model로 부터 SpacyNERModel을 임포트합니다. from spacy_custom_stage.model import SpacyNERModel # 현재 디렉토리의 model_class_registry를 임포트합니다. from .model_class_registry import * # 이 모듈에서 import 될 수 있는 모듈들을 정의합니다. __all__ = ["SpacyNERModel"]
다음 코드를 setup.py
파일의 setup()
안에 추가하십시오.
Copied!1 2 3
# 한국어 주석 # entry_points는 플러그인에 대한 정보를 담고 있습니다. entry_points={'foundry_ml.plugins': ['plugin=spacy_custom_stage']}
커밋, 빌드 및 릴리스 태그를 한 후에 새로운 모델 클래스를 Code Workbook 또는 Code Repositories에서 사용할 수 있어야 합니다.
사용자 지정 라이브러리를 저장하고 게시한 후 이제 SpaCy 모델을 생성, 저장 및 사용할 수 있습니다. 이 단계는 Code Repositories 또는 Code Workbook을 사용하여 수행할 수 있습니다. 아래의 스크린샷 및 코드 스니펫은 Code Workbook에서 가져온 것입니다.
다시 한 번, en_core_web_sm
은 미리 훈련된 spaCy 언어 모델이며 Conda 패키지로 Python 환경에 가져올 수 있습니다.
코드를 실행하기 전에 spacy-model-en_core_web_md와 spaCy 버전 2.3.x를 코딩 환경에 종속성으로 추가하세요.
방금 생성한 Python 모델 클래스는 이제 spacy-custom-ner-stage
로 Python 환경에 가져올 수 있어야 합니다. Code Repositories에서 개발 중이라면, 백킹 저장소로 spacy-custom-ner-stage
를 추가해야 합니다.
모델을 생성하려면:
Copied!1 2 3 4 5 6 7 8 9 10 11 12
import spacy from foundry_ml import Model, Stage # 새로운 모델 클래스를 가져옵니다. from spacy_custom_stage import SpacyNERModel def spacy_model(): # 벡터가 포함된 spacy 모델을 전달합니다. model = SpacyNERModel('en_core_web_sm') return Model(Stage(model))
이제 모델을 적용합니다:
Copied!1 2 3 4 5 6 7 8 9 10 11
def model_inference(spacy_model): import pandas as pd # 예제 데이터셋 df = pd.DataFrame({"text": ["The White House is a white building in Washington D.C.", "Cats is a Broadway musical in New York"]}) # spacy 모델을 사용하여 데이터 프레임 변환 output = spacy_model.transform(df) return output