optimum/neuron/peft/mapping.py (71 lines of code) (raw):
# coding=utf-8
# Copyright 2025 The HuggingFace Inc. team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Optional
from transformers import PreTrainedModel
from ..utils.import_utils import is_peft_available
from ..utils.patching import Patcher
from .peft_model import NeuronPeftModel, NeuronPeftModelForCausalLM
from .tuners import NeuronLoraModel
if is_peft_available():
from peft.config import PeftConfig
from peft.mapping import MODEL_TYPE_TO_PEFT_MODEL_MAPPING, PEFT_TYPE_TO_CONFIG_MAPPING
from peft.mapping import PEFT_TYPE_TO_TUNER_MAPPING as ORIG_PEFT_TYPE_TO_TUNER_MAPPING
from peft.mapping import get_peft_model as orig_get_peft_model
from peft.mixed_model import PeftMixedModel
from peft.peft_model import PeftModel
from peft.tuners.tuners_utils import BaseTuner
from peft.utils import PeftType
else:
class BaseTuner:
pass
class PeftConfig:
pass
class PeftMixedModel:
pass
class PeftModel:
pass
PEFT_TYPE_TO_CONFIG_MAPPING = {}
MODEL_TYPE_TO_PEFT_MODEL_MAPPING = {}
ORIG_PEFT_TYPE_TO_TUNER_MAPPING = {}
def orig_get_peft_model(*args, **kwargs):
pass
class PeftType:
pass
# These mappings should represent the same thing as far as I understand.
# We define both to match what is being done in peft.
PEFT_TYPE_TO_TUNER_MAPPING: dict[str, type[BaseTuner]] = {
"LORA": NeuronLoraModel,
}
PEFT_TYPE_TO_MODEL_MAPPING: dict[str, type[BaseTuner]] = {
PeftType.LORA: NeuronLoraModel,
}
MODEL_TYPE_TO_PEFT_MODEL_MAPPING: dict[str, type[NeuronPeftModel]] = {
"CAUSAL_LM": NeuronPeftModelForCausalLM,
}
def get_peft_model(
model: PreTrainedModel,
peft_config: PeftConfig,
adapter_name: str = "default",
mixed: bool = False,
autocast_adapter_dtype: bool = True,
revision: Optional[str] = None,
low_cpu_mem_usage: bool = False,
) -> PeftModel | PeftMixedModel:
if peft_config.peft_type not in PEFT_TYPE_TO_TUNER_MAPPING:
raise ValueError(
"PEFT type {peft_config.peft_type} not supported in Optimum Neuron. Supported types are: "
f"{list(PEFT_TYPE_TO_TUNER_MAPPING.keys())}"
)
# The PEFT_TYPE_TO_MODEL_MAPPING is used to map the PEFT type to the model type.
# Instead of rewriting the whole function, we just patch this dictionary to use our own peft tuners.
patcher = Patcher(
[
("peft.peft_model.PEFT_TYPE_TO_MODEL_MAPPING", PEFT_TYPE_TO_MODEL_MAPPING),
("peft.mapping.MODEL_TYPE_TO_PEFT_MODEL_MAPPING", MODEL_TYPE_TO_PEFT_MODEL_MAPPING),
]
)
with patcher:
peft_model = orig_get_peft_model(
model,
peft_config,
adapter_name=adapter_name,
mixed=mixed,
autocast_adapter_dtype=autocast_adapter_dtype,
revision=revision,
low_cpu_mem_usage=low_cpu_mem_usage,
)
return peft_model