chenghao/sec-material-contracts-qa
Viewer • Updated • 804 • 203 • 3
How to use chenghao/idefics2-edgar with Transformers:
# Use a pipeline as a high-level helper
from transformers import pipeline
pipe = pipeline("document-question-answering", model="chenghao/idefics2-edgar") # Load model directly
from transformers import AutoModel
model = AutoModel.from_pretrained("chenghao/idefics2-edgar", dtype="auto")Idefices2 8B fine-tuned on 800+ multi-page documents for Visual DocQA. Make sure you have the latest peft and transformers before loading the model. GPU is required for it to work properly.
Compared to the base model, it has a lower edit distance (53% improvement on micro average) on the test set.
| Category | Idefics2-8B | Idefics2-8B-EDGAR | Δ(↑) | |
|---|---|---|---|---|
| 0 | agreement_date | 0.878489 | 0.0999479 | 88.62% |
| 1 | agreement_term | 0.907067 | 0.438816 | 51.62% |
| 2 | auto_renewal | 0.634946 | 0.0516129 | 91.87% |
| 3 | contract_value | 0.474438 | 0.418815 | 11.72% |
| 4 | counterparty_address | 0.771387 | 0.59835 | 22.43% |
| 5 | counterparty_name | 0.825491 | 0.633359 | 23.27% |
| 6 | counterparty_signer_name | 0.842091 | 0.480444 | 42.95% |
| 7 | counterparty_signer_title | 0.61746 | 0.496041 | 19.66% |
| 8 | effective_date | 0.903268 | 0.125641 | 86.09% |
| 9 | expiration_date | 0.88673 | 0.235197 | 73.48% |
| 10 | governing_law | 0.881037 | 0.308771 | 64.95% |
| 11 | opt_out_length | 0.431548 | 0.047619 | 88.97% |
| 12 | party_address | 0.730897 | 0.608301 | 16.77% |
| 13 | party_name | 0.726411 | 0.490194 | 32.52% |
| 14 | payment_frequency | 0.686123 | 0.373724 | 45.53% |
| 15 | payment_term | 0.854552 | 0.593333 | 30.57% |
| 16 | renewal_term | 0.92829 | 0.0595238 | 93.59% |
| 17 | termination_for_cause | 0.436 | 0.048 | 88.99% |
| 18 | termination_for_convenience | 0.628261 | 0.156522 | 75.09% |
| 19 | termination_notice_period | 0.329748 | 0.178394 | 45.90% |
| 20 | venue | 0.781417 | 0.61403 | 21.42% |
Finetuned form Idefics2.
import torch
from transformers import AutoProcessor, Idefics2ForConditionalGeneration, BitsAndBytesConfig
from datasets import load_from_disk
base_model = "HuggingFaceM4/idefics2-8b"
peft_model_id = "chenghao/idefics2-edgar"
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.float16
)
model = Idefics2ForConditionalGeneration.from_pretrained(
peft_model_id,
torch_dtype=torch.float16,
quantization_config=quantization_config,
)
model.eval()
processor = AutoProcessor.from_pretrained(base_model, do_image_splitting=True,
size={"longest_edge": 490, "shortest_edge": 350})
dataset = load_from_disk("local-dataset")
test_example = dataset["test"][30]
images, question, answer = test_example["images"], test_example["question"], test_example["answer"]
messages = [
{
"role": "user",
"content": [{"type": "image"} for _ in range(len(images))] + [{"type": "text", "text": question}],
},
]
prompt = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(text=prompt, images=images, return_tensors="pt").to("cuda")
with torch.no_grad():
generated_ids = model.generate(**inputs, max_new_tokens=1024)
generated_texts = processor.batch_decode(generated_ids, skip_special_tokens=True)
preds = [t.split("Assistant:", 1)[-1].strip() for t in generated_texts]
print(f"""
Question: {question}
Answer: {answer}
Prediction: {preds or 'N/A'}
""")
10 epochs with QLoRA. Trained with A100-80GB for about 10 hours. Code: Github.
MAX_LENGTH = 1024
USE_LORA = False
USE_QLORA = True
MAX_PAGE = 5
config = {
"max_epochs": 10,
# "val_check_interval": 0.2,
"check_val_every_n_epoch": 1,
"gradient_clip_val": 1.0,
"accumulate_grad_batches": 12,
"lr": 1e-4,
"batch_size": 2,
"precision": "16-mixed",
"seed": 42,
"warmup_steps": 50,
"result_path": "./result",
"verbose": True,
}
No image splitting due to memory limit.
processor = AutoProcessor.from_pretrained(
"HuggingFaceM4/idefics2-8b",
do_image_splitting=False,
size={"longest_edge": 490, "shortest_edge": 350}
)
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.float16
)
model = Idefics2ForConditionalGeneration.from_pretrained(
"HuggingFaceM4/idefics2-8b",
torch_dtype=torch.float16,
quantization_config=quantization_config,
)
20% percent of the dataset.
Edit Distance (nltk).
See above.