srikarp's picture
Upload 23 files
c1de90b verified
Raw
History Blame Contribute Delete
2.6 kB
from __future__ import annotations
import re
from .modeling import load_model_and_tokenizer
from .safety import assert_safe
_FIRST_FENCED_BLOCK_RE = re.compile(r"```(?:[a-zA-Z0-9_+-]+)?\s*.*?```", re.DOTALL)
def clean_completion(completion: str) -> str:
completion = completion.strip()
fenced_match = _FIRST_FENCED_BLOCK_RE.search(completion)
if fenced_match:
return fenced_match.group(0).strip()
stop_markers = ["\n### Instruction:", "\n### Input:", "\n### Response:"]
end = len(completion)
for marker in stop_markers:
marker_index = completion.find(marker)
if marker_index != -1:
end = min(end, marker_index)
return completion[:end].strip()
def load_generator(
base_model: str,
*,
adapter: str | None = None,
quantization: str = "none",
dtype: str = "auto",
trust_remote_code: bool = False,
):
return load_model_and_tokenizer(
base_model,
adapter=adapter,
quantization=quantization,
dtype=dtype,
trust_remote_code=trust_remote_code,
for_training=False,
)
def generate_code(
model,
tokenizer,
torch,
*,
instruction: str,
input_text: str | None = None,
max_new_tokens: int = 512,
temperature: float = 0.2,
top_p: float = 0.95,
safety: bool = True,
) -> str:
request_text = f"{instruction}\n{input_text or ''}"
assert_safe(request_text, enabled=safety)
user_content = instruction
if input_text:
user_content += f"\n{input_text}"
messages = [
{"role": "user", "content": user_content},
]
inputs = tokenizer.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt",
)
device = next(model.parameters()).device
inputs = {key: value.to(device) for key, value in inputs.items()}
do_sample = temperature > 0
with torch.no_grad():
output_ids = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=do_sample,
temperature=temperature if do_sample else None,
top_p=top_p if do_sample else None,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
prompt_length = inputs["input_ids"].shape[-1]
completion_ids = output_ids[0][prompt_length:]
completion = clean_completion(tokenizer.decode(completion_ids, skip_special_tokens=True))
assert_safe(completion, enabled=safety)
return completion