본문으로 이동
CoMLRL
사용자 가이드

학습 대상

translategemma:4b 자동 번역 영어 원문

CoMLRL 는 LLM 에이전트 훈련을 지원하며, LLM 기반의 critics 또는 보상 모델을 사용하여 훈련을 용이하게 합니다. 에이전트 및 critics 는 Hugging Face 또는 로컬 디렉토리에서 가져온 동종 또는 이종 모델일 수 있습니다. 사용자는 Hugging Face 모델 식별자 를 agent_model/critic_model 를 통해 동종 설정의 경우, 또는 agents/critics 목록을 통해 이종 설정의 경우 지정할 수 있습니다. 훈련된 대상은 추가 훈련을 위해 새로운 trainer 로 저장하고 로드할 수 있습니다.

LLM 에이전트#

동종 에이전트#

동종 에이전트는 단일 모델 식별자를 agent_model 에 설정하고 agents=None 를 비워 두어 초기화됩니다. trainers 의 별도의 num_agents 생성자 인수를 사용하는 경우, 해당 인수를 일치하는 구성 값과 함께 설정할 수 있습니다. 구성 자체는 이를 덮어쓰지 않습니다.

다음 예시는 세 개의 Qwen/Qwen2.5-1.5B 에이전트를 로드합니다:

trainer = MAGRPOTrainer(
    agent_model="Qwen/Qwen2.5-1.5B",
    agents=None,
    num_agents=3,
    reward_func=reward_func,
    train_dataset=train_dataset,
    args=MAGRPOConfig(num_agents=3, num_turns=1, temperature=0.7, top_p=0.9, top_k=None),
)

이종 에이전트#

동종 에이전트는 서로 다른 역할과 역할을 맡고, 별도의 작업의 여러 부분에서 병렬로 작업하도록 유도할 수 있지만, 이종 에이전트는 서로 다른 모델의 전문적인 기능을 기여할 수 있습니다.

사용자는 agents 에 모델 식별자 또는 로드된 모델 객체를 제공하여 이종 에이전트를 초기화할 수 있으며, tokenizer 를 통해 호환되는 tokenizers 를 제공합니다. agents 를 제공하면, agent_model 는 None 로 유지될 수 있습니다. 둘 다 제공되면, 모델 이름은 일치해야 하고, 목록 길이는 에이전트 수와 일치해야 합니다. 그렇지 않으면 훈련 중에 오류가 발생합니다.

다음 예시는 Qwen/Qwen2.5-Coder-3B 및 Qwen/Qwen2.5-Coder-7B 에이전트를 로드합니다:

trainer = MAGRPOTrainer(
    agent_model=None,
    agents=["Qwen/Qwen2.5-Coder-3B", "Qwen/Qwen2.5-Coder-7B"],
    reward_func=reward_func,
    train_dataset=train_dataset,
    args=MAGRPOConfig(num_agents=2, num_turns=1, temperature=0.7, top_p=0.9, top_k=None),
)

LLM Critics#

독립적인 알고리즘과 같은 것 Actor-Critic (IAC) 및 다중 에이전트 Actor-Critic (MAAC) 사용 LLM critics. 이러한 것들 critics 로드되는 값은 알고리즘과에 따라 결정됩니다 use_separate_critic 설정. MARLHF trainers 과 함께 rl_algorithm="maac" 또는 "iac" 동일한 것을 수락 critic_model 그리고 critics 인수, 또는 critic_model_name 그들의 설정에서; 그렇지 않으면, 첫 번째를 사용합니다 actor’s 모델 식별자.

중앙 집중식 Critic#

별도의 중앙 집중식 critic 는 critic_model 또는 단일 요소 critics 목록을 통해 로드할 수 있습니다. 이는 지원되는 인과 언어 모델이어야 합니다: trainer 는 value head 를 추가하고 첫 번째 actor 의 tokenizer 로 공동 입력을 인코딩합니다. 따라서 tokenizer 도 critic 와 호환되어야 합니다.

다음 예시는 Qwen/Qwen2.5-Coder-3B 및 Qwen/Qwen2.5-Coder-1.5B actors 를 중앙 집중식 Qwen/Qwen2.5-Coder-7B critic 와 함께 사용합니다:

trainer = MAACTrainer(
    agent_model=None,
    agents=["Qwen/Qwen2.5-Coder-3B", "Qwen/Qwen2.5-Coder-1.5B"],
    tokenizer=[
        AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-3B"),
        AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-1.5B"),
    ],
    critic_model="Qwen/Qwen2.5-Coder-7B",
    critics=None,
    reward_func=reward_func,
    train_dataset=train_dataset,
    args=MAACConfig(num_agents=2, num_turns=1, temperature=0.7, top_p=0.9, top_k=None),
)

독립적인 Critics#

독립적으로 critics, 각 에이전트는 자체 critic. 과 use_separate_critic=True, 사용자는 하나를 제공할 수 있습니다 critic_model 에이전트마다 별도의 복사본을 로드하기 위한 식별자를 사용하거나, critics 길이가 num_agents. 각 별개의 critic 을 받습니다 token IDs 자신의 actor’s tokenizer 그리고 호환되어야 합니다. use_separate_critic=False 를 사용하면, 각 actor 및 critic 는 LLM backbone 를 공유하고 함께 로드됩니다. 이 경우, critic_model 및 critics 는 설정되지 않습니다 (null 또는 None ). 에이전트와 마찬가지로, critic_model 및 critics 를 모두 제공하려면, 모델 이름과 길이가 일치해야 합니다. 그렇지 않으면, 훈련 중에 오류가 발생합니다.

다음 예시는 동일한 모델을 기반으로 별도의 critics 로 Qwen/Qwen2.5-Coder-3B 및 Qwen/Qwen2.5-Coder-7B actors 를 로드합니다:

trainer = IACTrainer(
    agent_model=None,
    agents=["Qwen/Qwen2.5-Coder-3B", "Qwen/Qwen2.5-Coder-7B"],
    tokenizer=[
        AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-3B"),
        AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-7B"),
    ],
    critic_model=None,
    critics=["Qwen/Qwen2.5-Coder-3B", "Qwen/Qwen2.5-Coder-7B"],
    reward_func=reward_func,
    train_dataset=train_dataset,
    args=IACConfig(
        num_agents=2,
        num_turns=1,
        use_separate_critic=True,
        temperature=0.7,
        top_p=0.9,
        top_k=None,
    ),
)

대안으로, 각 actor는 critic와 동일한 모델을 공유할 수 있습니다:

trainer = IACTrainer(
    agent_model=None,
    agents=["Qwen/Qwen2.5-Coder-3B", "Qwen/Qwen2.5-Coder-7B"],
    tokenizer=[
        AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-3B"),
        AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-7B"),
    ],
    critic_model=None,
    critics=None,
    reward_func=reward_func,
    train_dataset=train_dataset,
    args=IACConfig(
        num_agents=2,
        num_turns=1,
        use_separate_critic=False,
        temperature=0.7,
        top_p=0.9,
        top_k=None,
    ),
)

Trainers는 agents/critics 목록을 내부적으로 사용합니다. agent_model 및 critic_model 매개변수는 동종 설정에 대한 단축키이며, 해당 목록이 제공되는 경우 일관성을 유지해야 합니다.

MAGRPO 로딩 tokenizers 자동으로, 모델 식별자 문자열에 대해. MAAC/IAC 로딩 tokenizer 자동으로, agent_model, 하지만 명시적인 tokenizer 경우에 agents 제공되면, 문자열이 포함되어 있더라도, 로드된 모델 객체는 호환 가능한 공유 tokenizer 또는 tokenizer 목록이 actors. 이종 actors 각각 자체 호환 가능한 tokenizer; 별도의 critics 요청을 actor’s token IDs (첫 번째 actor’s IDs 에 대해 MAAC).

LLM 보상 모델#

내 PbRL, MARLHF 선호 쌍에서 공동 보상 모델을 학습하고, 이를 정책 학습의 보상으로 고정합니다. 이는 backbone 다음을 통해 로드됩니다 reward_model_name 내 MARLHFConfig, 다음에서 Hugging Face 모델 식별자 또는 인과적 언어 모델의 로컬 디렉토리에서 가져옵니다. 기본적으로 첫 번째 actor’모델 식별자를 사용하며, 다음이 필요합니다 actors 모델 객체에 식별자가 없는 경우 trainer 다음을 로드합니다 backbone 자신의 tokenizer, 마지막 패딩이 아닌 부분에 스칼라 헤드를 추가하고 token, 모델을 reward_model_device (기본값으로 "cuda:0"; None 다음을 사용합니다 trainer 장치). reward_freeze_backbone=True 머리만 학습합니다.

다음 예시는 두 Qwen/Qwen2.5-Coder-3B 에이전트에 대한 Qwen/Qwen2.5-Coder-7B 보상 모델을 로드하는 방법을 보여줍니다:

from comlrl.trainers.preference import MARLHFConfig, MARLHFTrainer

trainer = MARLHFTrainer(
    agent_model="Qwen/Qwen2.5-Coder-3B",
    num_agents=2,
    reward_func=reward_func,
    train_dataset=train_dataset,
    args=MARLHFConfig(
        num_agents=2,
        num_turns=1,
        reward_model_name="Qwen/Qwen2.5-Coder-7B",
        reward_model_device="cuda:1",
    ),
)

MARLHFIterTrainer 는 각 반복에서 이 소스에서 보상 모델을 다시 로드하여 선호 학습을 수행합니다. reward_func 의 작업 보상은 여전히 선호 쌍을 레이블링합니다. 학습 초기화는 규칙 기반 또는 LLM 기반 작업 보상을 전달하는 방법을 설명합니다.

학습 저장 및 재개#

모델 저장#

사용자는 학습 후 save_model(output_dir) 를 호출하여 actors 의 Hugging Face 모델 구성, 가중치 및 tokenizers 를 로컬 디렉터리에 저장할 수 있습니다:

trainer.train()
trainer.save_model("./saved-models/run-1")

저장된 모델에서 학습#

학습은 원래 역할 순서로 actors 의 디렉터리를 제공하여 저장된 두 개의 actor MAGRPO 설정에서 계속할 수 있습니다. 부모 run-1 디렉터리에 actors 가 포함되어 있으며, 각 agent_i 디렉터리는 로드 가능한 모델입니다.

from comlrl.trainers.reinforce import MAGRPOConfig, MAGRPOTrainer

continued_trainer = MAGRPOTrainer(
    agents=[
        "./saved-models/run-1/agent_0",
        "./saved-models/run-1/agent_1",
    ],
    num_agents=2,
    reward_func=reward_func,
    train_dataset=train_dataset,
    args=MAGRPOConfig(
        num_agents=2,
        num_turns=1,
        num_train_epochs=3,
        agent_learning_rate=5e-6,
        temperature=0.7,
        top_p=0.9,
        top_k=None,
    ),
)
continued_trainer.train()
continued_trainer.save_model("./saved-models/run-2")

MAGRPO 는 actor 디렉터리에서 tokenizers 를 자동으로 로드합니다. 여기에서 num_train_epochs=3 는 새로운 학습 실행에서 세 개의 epochs 를 의미합니다. 데이터 세트, 보상 함수, 학습 구성 및 모든 사용자 지정 형식, 보상 처리기 또는 외부 트랜지션을 다시 제공해야 합니다. save_model 는 이를 저장하지 않습니다.

다른 trainers 도 동일한 로컬-디렉토리 접근 방식을 지원하며, tokenizer 및 actor 의 개수 요구 사항에 따릅니다. 선호 학습 trainers 는 새로운 실행의 구성에 따라 선호 수집 및 보상 학습을 시작합니다.

IAC 및 MAAC 는 value heads 를 개별적으로 value_head.pt 로 저장합니다. 생성자를 통해 critic 또는 공유 actor 디렉터리를 로드하면 언어 모델 backbone 가 복원되고 새로운 value head 가 생성됩니다. 사용자는 train() 를 호출하기 전에 저장된 헤드를 명시적으로 복원하여 학습된 값을 유지할 수 있습니다. 학습 체크포인트는 save_model 수출과 달리 value heads 를 자동으로 복원합니다.

기본 선형 value head 를 사용하는 저장된 두 개의 actor MAAC 설정의 경우:

from pathlib import Path
import torch
from transformers import AutoTokenizer
from comlrl.trainers.actor_critic import MAACConfig, MAACTrainer

saved_dir = Path("./saved-models/maac-run-1")
actor_dirs = [str(saved_dir / f"agent_{i}") for i in range(2)]

continued_maac = MAACTrainer(
    agents=actor_dirs,
    tokenizer=[AutoTokenizer.from_pretrained(path) for path in actor_dirs],
    critic_model=str(saved_dir / "critic"),
    reward_func=reward_func,
    train_dataset=train_dataset,
    args=MAACConfig(num_agents=2, num_turns=1, num_train_epochs=3),
)
continued_maac.critics[0].value_head.load_state_dict(
    torch.load(
        saved_dir / "critic" / "value_head.pt",
        map_location="cpu",
        weights_only=True,
    )
)
continued_maac.train()
continued_maac.save_model("./saved-models/maac-run-2")

위의 IAC, 동일한 load_state_dict 단계는 다음 경우에 적용됩니다 continued_iac.agents[i].value_head 또는 다음 경우에 적용됩니다 use_separate_critic=False, 또는 continued_iac.critics[i].value_head 다음과 같은 경우에 True. 별도의 critic backbones 또한 다음을 통해 로드해야 합니다 critic_model 또 critics.

value-head 아키텍처는 저장된 런과 일치해야 합니다. IAC는 공유 헤드에 대한 IACConfig.value_head_hidden_dim 및 별도 헤드에 대한 IACConfig.critic_value_head_hidden_dim가 필요합니다. 사용자 지정 MAAC 헤드는 trainer 생성자에 대한 원래 model_config={"critic_value_head_hidden_dim": ...}를 필요로 합니다. 동일한 값 학습 설정으로 계속하려면 원래 critic_type ("v" 또는 "q")도 필요합니다.

학습 상태#

사용자는 train(checkpoint_dir=...)를 통해 학습 체크포인트를 활성화하고 resume_from_checkpoint와 호환되는 trainer를 재개할 수 있습니다:

# Save a checkpoint at each completed training boundary.
trainer.train(checkpoint_dir="./checkpoints", checkpoint_interval=1)

# Recreate the trainer with the same models, tokenizers, data, and callbacks.
resumed_trainer.train(
    resume_from_checkpoint="./checkpoints/checkpoint-1",
    checkpoint_dir="./checkpoints",
    checkpoint_interval=1,
)

체크포인트는 모델 및 최적화기 상태, 학습 진행 상황, 무작위 상태, 해당되는 경우 PbRL 데이터 및 기록을 보존합니다.

체크포인트는 완료된 epochs, 반복 또는 PbRL 단계 또는 최종 저장 시 저장됩니다. checkpoint_interval는 주기적인 저장 제어합니다. 재개는 마지막 체크포인트 이후의 모든 작업을 반복합니다.

num_train_epochs 및 num_iterations는 완료된 작업, 재개 시 증가할 수 있는 총 런을 계산합니다. 모델, tokenizers, 데이터 및 학습 설정은 호환되어야 합니다. 상태가 있는 데이터 세트 및 콜백은 state_dict() 및 load_state_dict()를 제공할 수 있습니다. 외부 서비스 상태는 복원되지 않습니다. PbRL 출력 디렉터리에 파일이 이미 있는 경우, 재개된 출력은 resume-* 하위 디렉터리에 저장됩니다.

W&B의 경우, 저장된 런 식별은 trainer가 구성되기 전에 기존 wandb_config에 병합될 수 있습니다. 이렇게 하면 로깅 및 출력 설정이 유지되고 구성 중에 빈 런이 열리지 않습니다:

from comlrl.utils import read_checkpoint_metadata

checkpoint = "./checkpoints/checkpoint-1"
identity = read_checkpoint_metadata(checkpoint)["wandb"]
if identity and "id" not in wandb_config and "resume" not in wandb_config:
    wandb_config = {**wandb_config, **identity, "resume": "allow"}

# Pass wandb_config to the trainer constructor before resuming.

명시적인 id 또는 resume 설정이 우선 적용됩니다. 체크포인트에 W&B 식별 정보가 없으면, 헬퍼는 None 를 wandb 에 대해 반환하고 기존 설정은 유지됩니다.

체크포인트 기능은 기본적으로 비활성화되어 있습니다: train() (체크포인트 옵션 없이)는 훈련 체크포인트를 저장하지 않습니다. save_model() 는 모델만 내보냅니다. 훈련을 재개하는 데 필요한 전체 상태를 저장하지 않습니다.