This project replaces the upstream network of CEAK (Chemical Electrolyte Analysis Kit) with components from LLaMA language model. It provides tools for:
- Training custom models with LLaMA embeddings
- Evaluating model performance
- Predicting electrolyte properties
- Integration of LLaMA embeddings with CEAK architecture
- Support for both ID-based and prompt-based input formats
- Flexible configuration options:
- Pretrained weight loading
- Embedding layer freezing
- Pooling operations
- Partial LLaMA model integration
- Transformers <=4.46.1
- Clone the repository:
git clone https://github.com/BrevityD/LLaMA_CEAK.git
cd LLaMA_CEAK- Install dependencies using Poetry:
poetry installModify pyproject.toml for project-specific settings and dependencies.
The project provides several training scripts:
- Standard Training:
scripts/train_fewlayer.py - Continuous Training:
scripts/continuous_train.py - K-Fold Validation:
scripts/kfold_train.py - Large Model Training:
scripts/train_70B.py
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from loguru import logger
from torch.utils.data import DataLoader
from transformers import AutoTokenizer, AutoModelForCausalLM
from llamaceak.datasets import CEAKDataset
from llamaceak.model import CEAK_Llama
model_id = "/home/~/pretrained_models/Llama-3.2-1B-Instruct/"
tokenizer = AutoTokenizer.from_pretrained(model_id)
pretrained_model = AutoModelForCausalLM.from_pretrained(model_id)
train_args = {}
train_args["model_id"] = model_id
train_args["vocab_size"], train_args["embedding_dim"] = pretrained_model.get_input_embeddings().weight.shape
train_args["hidden_dim"] = train_args["embedding_dim"] // 4
train_args["pooling"] = 8 # NEEDED None
train_args["batch_size"] = 1
train_args["num_epochs"] = 10
train_args["learning_rate"] = 0.001
train_args["is_freezed"]=False # NEEDED
train_args["dataset_path"] = "./data/ceak_datasets_sub.csv"
save_dir = "ckpts/llama-1B-fd-p-uf-lr13" # NEEDED llama-{1B}-{fd/od}-{p/n}-{f/uf}-{lr14}
logger.debug(f"vocab_size is {train_args['vocab_size']}, embedding_dim is {train_args['embedding_dim']}, hidden_dim is {train_args['hidden_dim']}")
with open(save_dir+"/train_args.json", "w") as f:
json.dump(train_args, f, indent=4)
net_instructinit_freezed = CEAK_Llama(
vocab_size=train_args["vocab_size"],
embedding_dim=train_args["embedding_dim"],
hidden_dim=train_args["hidden_dim"],
pretrained_weights=pretrained_model.get_input_embeddings().weight,
is_freezed=train_args["is_freezed"],
pooling=train_args["pooling"]
)
with open(save_dir+"/model_arc.txt", "w") as wf:
wf.write(str(net_instructinit_freezed))
del pretrained_model
torch.cuda.empty_cache()
criterion = nn.MSELoss() # For regression
optimizer = optim.Adam(net_instructinit_freezed.parameters(), lr=train_args["learning_rate"])
dataset = CEAKDataset(
dataframe = pd.read_csv(train_args["dataset_path"]),
tokenizer = tokenizer
)
dataloader = DataLoader(dataset, batch_size=train_args["batch_size"], shuffle=True)
train_model(
model=net_instructinit_freezed,
dataloader=dataloader,
criterion=criterion,
optimizer=optimizer,
num_epochs=train_args["num_epochs"],
save_dir=save_dir,
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
)from transformers import AutoTokenizer
from llamaceak.eval import eval_model
import pandas as pd # Required to be imported last for compatibility
testset_file="./data/ceak.csv"
model_folder="./ckpts/dpo-v1v1-1B-fd-p-f-lr13-5fd"
dataframe = pd.read_csv(testset_file)
pth_files = []
for root, _, files in os.walk(model_folder):
for file in files:
if file.endswith(".pth"):
pth_files.append(os.path.join(root, file))
import json
with open(os.path.join(model_folder, "train_args.json"), "r") as f:
train_args = json.load(f)
model_id = train_args["model_id"]
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token
rmse = {}
for model_file in pth_files:
rmse.update(
{
model_file: eval_model(
model_path=model_file,
train_args=train_args,
dataframe=dataframe,
tokenizer=tokenizer,
)
}
)
with open(os.path.join(model_folder, "eval_result.json"), "w") as f:
json.dump(rmse, f)Checkpoints follow a standardized naming convention:
llama-{MODEL_SIZE}-{DATASET}-{POOLING}-{FREEZE}-{LR}
Where:
MODEL_SIZE: Model parameter count (e.g., 1B, 70B)DATASET:fd(filtered) orod(original)POOLING:p(pooled) orn(no pooling)FREEZE:f(frozen) oruf(unfrozen)LR: Learning rate (e.g., lr13 for 1e-3)
.
├── llamaceak/ # Core package
│ ├── __init__.py # Module exports
│ ├── model.py # Model architectures
│ ├── datasets.py # Data loading
│ ├── train.py # Training utilities
│ └── eval.py # Evaluation utilities
├── scripts/ # Training scripts
│ ├── continuous_train.py
│ ├── eval_llama.py
│ ├── kfold_train.py
│ ├── train_70B.py
│ └── train_fewlayer.py
├── utils/ # Utility scripts
│ ├── subdata.py # Data filtering
│ └── test_dataloader.py
├── pyproject.toml # Project configuration
└── README.md # Project documentation
For detailed API documentation, refer to the docstrings in each module file.