| |
| """ |
| Upload FlowFinal model components to Hugging Face Hub. |
| """ |
|
|
| import os |
| from huggingface_hub import HfApi, upload_file, upload_folder |
| import shutil |
| from datetime import datetime |
| import json |
|
|
| def create_model_card(): |
| """Create a comprehensive model card for FlowFinal.""" |
| model_card = """--- |
| license: mit |
| tags: |
| - protein-generation |
| - antimicrobial-peptides |
| - flow-matching |
| - protein-design |
| - esm |
| - amp |
| library_name: pytorch |
| --- |
| |
| # FlowFinal: AMP Flow Matching Model |
| |
| FlowFinal is a state-of-the-art flow matching model for generating antimicrobial peptides (AMPs). The model uses continuous normalizing flows to generate protein sequences in the ESM-2 embedding space. |
| |
| ## Model Description |
| |
| - **Model Type**: Flow Matching for Protein Generation |
| - **Domain**: Antimicrobial Peptide (AMP) Generation |
| - **Base Model**: ESM-2 (650M parameters) |
| - **Architecture**: Transformer-based flow matching with classifier-free guidance (CFG) |
| - **Training Data**: Curated AMP dataset with ~7K sequences |
| |
| ## Key Features |
| |
| - **Classifier-Free Guidance (CFG)**: Enables controlled generation with different conditioning strengths |
| - **ESM-2 Integration**: Leverages pre-trained protein language model embeddings |
| - **Compression Architecture**: Efficient 16x compression of ESM-2 embeddings (1280 β 80 dimensions) |
| - **Multiple CFG Scales**: Support for no conditioning (0.0), weak (3.0), strong (7.5), and very strong (15.0) guidance |
| |
| ## Model Components |
| |
| ### Core Architecture |
| - `final_flow_model.py`: Main flow matching model implementation |
| - `compressor_with_embeddings.py`: Embedding compression/decompression modules |
| - `final_sequence_decoder.py`: ESM-2 embedding to sequence decoder |
| |
| ### Trained Weights |
| - `final_compressor_model.pth`: Trained compressor (315MB) |
| - `final_decompressor_model.pth`: Trained decompressor (158MB) |
| - `amp_flow_model_final_optimized.pth`: Main flow model checkpoint |
| |
| ### Generated Samples (Today's Results) |
| - Generated AMP sequences with different CFG scales |
| - HMD-AMP validation results showing 8.8% AMP prediction rate |
| |
| ## Performance Results |
| |
| ### HMD-AMP Validation (80 sequences tested) |
| - **Total AMPs Predicted**: 7/80 (8.8%) |
| - **By CFG Configuration**: |
| - No CFG: 1/20 (5.0%) |
| - Weak CFG: 2/20 (10.0%) |
| - Strong CFG: 4/20 (20.0%) β Best performance |
| - Very Strong CFG: 0/20 (0.0%) |
| |
| ### Best Performing Sequences |
| 1. `ILVLVLARRIVGVIVAKVVLYAIVRSVVAAAKSISAVTVAKVTVFFQTTA` (No CFG) |
| 2. `EDLSKAKAELQRYLLLSEIVSAFTALTRFYVVLTKIFQIRVKLIAVGQIL` (Weak CFG) |
| 3. `IKLSRIAGIIVKRIRVASGDAQRLITASIGFTLSVVLAARFITIILGIVI` (Strong CFG) |
| |
| ## Usage |
| |
| ```python |
| from generate_amps import AMPGenerator |
| |
| # Initialize generator |
| generator = AMPGenerator( |
| model_path="amp_flow_model_final_optimized.pth", |
| device='cuda' |
| ) |
| |
| # Generate AMP samples |
| samples = generator.generate_amps( |
| num_samples=20, |
| num_steps=25, |
| cfg_scale=7.5 # Strong CFG recommended |
| ) |
| ``` |
| |
| ## Training Details |
| |
| - **Optimizer**: AdamW with cosine annealing |
| - **Learning Rate**: 4e-4 (final) |
| - **Epochs**: 2000 |
| - **Final Loss**: 1.318 |
| - **Training Time**: 2.3 hours on H100 |
| - **Dataset Size**: 6,983 samples |
| |
| ## Files Structure |
| |
| ``` |
| FlowFinal/ |
| βββ models/ |
| β βββ final_compressor_model.pth |
| β βββ final_decompressor_model.pth |
| β βββ amp_flow_model_final_optimized.pth |
| βββ generated_samples/ |
| β βββ generated_sequences_20250829.fasta |
| β βββ hmd_amp_detailed_results.csv |
| βββ src/ |
| β βββ final_flow_model.py |
| β βββ compressor_with_embeddings.py |
| β βββ final_sequence_decoder.py |
| β βββ generate_amps.py |
| βββ README.md |
| ``` |
| |
| ## Citation |
| |
| If you use FlowFinal in your research, please cite: |
| |
| ```bibtex |
| @misc{flowfinal2025, |
| title={FlowFinal: Flow Matching for Antimicrobial Peptide Generation}, |
| author={Edward Sun}, |
| year={2025}, |
| url={https://huggingface.co/esunAI/FlowFinal} |
| } |
| ``` |
| |
| ## License |
| |
| This model is released under the MIT License. |
| """ |
| return model_card |
|
|
| def main(): |
| print("π Starting comprehensive upload to Hugging Face Hub...") |
| |
| |
| api = HfApi() |
| repo_id = "esunAI/FlowFinal" |
| today = "20250829" |
| |
| |
| print("π Creating model card...") |
| model_card = create_model_card() |
| with open("README.md", "w") as f: |
| f.write(model_card) |
| |
| |
| print("π€ Uploading model card...") |
| upload_file( |
| path_or_fileobj="README.md", |
| path_in_repo="README.md", |
| repo_id=repo_id, |
| commit_message="Add comprehensive model card" |
| ) |
| |
| |
| print("π€ Uploading main model files...") |
| model_files = [ |
| "final_flow_model.py", |
| "compressor_with_embeddings.py", |
| "final_sequence_decoder.py", |
| "generate_amps.py", |
| "amp_flow_training_single_gpu_full_data.py", |
| "cfg_dataset.py", |
| "decode_and_test_sequences.py" |
| ] |
| |
| for file in model_files: |
| if os.path.exists(file): |
| print(f" Uploading {file}...") |
| upload_file( |
| path_or_fileobj=file, |
| path_in_repo=f"src/{file}", |
| repo_id=repo_id, |
| commit_message=f"Add {file}" |
| ) |
| |
| |
| print("π€ Uploading model weights...") |
| weight_files = [ |
| ("final_compressor_model.pth", "models/final_compressor_model.pth"), |
| ("final_decompressor_model.pth", "models/final_decompressor_model.pth"), |
| ("normalization_stats.pt", "models/normalization_stats.pt") |
| ] |
| |
| for local_file, repo_path in weight_files: |
| if os.path.exists(local_file): |
| print(f" Uploading {local_file} -> {repo_path}...") |
| upload_file( |
| path_or_fileobj=local_file, |
| path_in_repo=repo_path, |
| repo_id=repo_id, |
| commit_message=f"Add {local_file}" |
| ) |
| |
| |
| print("π€ Uploading flow model checkpoints...") |
| checkpoint_files = [ |
| ("/data2/edwardsun/flow_checkpoints/amp_flow_model_final_optimized.pth", "models/amp_flow_model_final_optimized.pth"), |
| ("/data2/edwardsun/flow_checkpoints/amp_flow_model_best_optimized.pth", "models/amp_flow_model_best_optimized.pth"), |
| ("/data2/edwardsun/flow_checkpoints/amp_flow_model_best_optimized_20250829_RETRAINED.pth", "models/amp_flow_model_best_optimized_20250829_RETRAINED.pth") |
| ] |
| |
| for checkpoint_path, repo_path in checkpoint_files: |
| if os.path.exists(checkpoint_path): |
| print(f" Uploading {os.path.basename(checkpoint_path)}...") |
| upload_file( |
| path_or_fileobj=checkpoint_path, |
| path_in_repo=repo_path, |
| repo_id=repo_id, |
| commit_message=f"Add {os.path.basename(checkpoint_path)}" |
| ) |
| |
| |
| print("π€ Uploading paper and documentation files...") |
| paper_files = [ |
| "paper_results.tex", |
| "supplementary_data.tex", |
| "latex_tables.tex" |
| ] |
| |
| for file in paper_files: |
| if os.path.exists(file): |
| print(f" Uploading {file}...") |
| upload_file( |
| path_or_fileobj=file, |
| path_in_repo=f"paper/{file}", |
| repo_id=repo_id, |
| commit_message=f"Add {file}" |
| ) |
| |
| |
| print("π€ Uploading training logs...") |
| log_files = [ |
| "fresh_training_aug29.log", |
| "h100_maximized_training.log", |
| "training_output_h100_max.log", |
| "training_output.log", |
| "launch_full_data_training.sh" |
| ] |
| |
| for file in log_files: |
| if os.path.exists(file): |
| print(f" Uploading {file}...") |
| upload_file( |
| path_or_fileobj=file, |
| path_in_repo=f"training_logs/{file}", |
| repo_id=repo_id, |
| commit_message=f"Add {file}" |
| ) |
| |
| |
| print("π€ Uploading datasets...") |
| dataset_files = [ |
| ("all_peptides_data.json", "datasets/all_peptides_data.json"), |
| ("combined_final.fasta", "datasets/combined_final.fasta"), |
| ("cfgdata.fasta", "datasets/cfgdata.fasta"), |
| ("uniprotkb_AND_reviewed_true_AND_model_o_2025_08_29.fasta", "datasets/uniprotkb_reviewed_proteins.fasta") |
| ] |
| |
| for local_file, repo_path in dataset_files: |
| if os.path.exists(local_file): |
| print(f" Uploading {local_file}...") |
| upload_file( |
| path_or_fileobj=local_file, |
| path_in_repo=repo_path, |
| repo_id=repo_id, |
| commit_message=f"Add {local_file}" |
| ) |
| |
| |
| print("π€ Uploading today's results and analysis...") |
| result_files = [ |
| "generated_sequences_20250829_144923.fasta", |
| "hmd_amp_detailed_results.csv", |
| "hmd_amp_cfg_analysis.csv", |
| "complete_amp_results.csv", |
| "summary_statistics.csv" |
| ] |
| |
| for file in result_files: |
| if os.path.exists(file): |
| print(f" Uploading {file}...") |
| upload_file( |
| path_or_fileobj=file, |
| path_in_repo=f"results/{file}", |
| repo_id=repo_id, |
| commit_message=f"Add {file}" |
| ) |
| |
| |
| print("π€ Uploading today's raw embeddings...") |
| embedding_dir = "/data2/edwardsun/generated_samples" |
| |
| embedding_files = [ |
| f"generated_amps_best_model_no_cfg_{today}.pt", |
| f"generated_amps_best_model_weak_cfg_{today}.pt", |
| f"generated_amps_best_model_strong_cfg_{today}.pt", |
| f"generated_amps_best_model_very_strong_cfg_{today}.pt" |
| ] |
| |
| for file in embedding_files: |
| file_path = os.path.join(embedding_dir, file) |
| if os.path.exists(file_path): |
| print(f" Uploading {file}...") |
| upload_file( |
| path_or_fileobj=file_path, |
| path_in_repo=f"generated_samples/embeddings/{file}", |
| repo_id=repo_id, |
| commit_message=f"Add {file}" |
| ) |
| |
| |
| print("π€ Uploading decoded sequences from today...") |
| decoded_dir = "/data2/edwardsun/decoded_sequences" |
| decoded_files = [ |
| f"decoded_sequences_no_cfg_00_{today}.txt", |
| f"decoded_sequences_weak_cfg_30_{today}.txt", |
| f"decoded_sequences_strong_cfg_75_{today}.txt", |
| f"decoded_sequences_very_strong_cfg_150_{today}.txt" |
| ] |
| |
| for file in decoded_files: |
| file_path = os.path.join(decoded_dir, file) |
| if os.path.exists(file_path): |
| print(f" Uploading {file}...") |
| upload_file( |
| path_or_fileobj=file_path, |
| path_in_repo=f"generated_samples/decoded_sequences/{file}", |
| repo_id=repo_id, |
| commit_message=f"Add {file}" |
| ) |
| |
| |
| print("π€ Uploading APEX analysis results...") |
| apex_dir = "/data2/edwardsun/apex_results" |
| apex_files = [ |
| f"apex_results_no_cfg_00_{today}.json", |
| f"apex_results_weak_cfg_30_{today}.json", |
| f"apex_results_strong_cfg_75_{today}.json", |
| f"apex_results_very_strong_cfg_150_{today}.json", |
| f"apex_results_all_cfg_comparison_{today}.json", |
| f"mic_summary_{today}.json" |
| ] |
| |
| for file in apex_files: |
| file_path = os.path.join(apex_dir, file) |
| if os.path.exists(file_path): |
| print(f" Uploading {file}...") |
| upload_file( |
| path_or_fileobj=file_path, |
| path_in_repo=f"analysis/apex_results/{file}", |
| repo_id=repo_id, |
| commit_message=f"Add {file}" |
| ) |
| |
| |
| print("π€ Uploading additional dataset files...") |
| additional_dataset_path = "/data2/edwardsun/decoded_sequences/all_dataset_peptides_sequences.txt" |
| if os.path.exists(additional_dataset_path): |
| print(" Uploading all_dataset_peptides_sequences.txt...") |
| upload_file( |
| path_or_fileobj=additional_dataset_path, |
| path_in_repo="datasets/all_dataset_peptides_sequences.txt", |
| repo_id=repo_id, |
| commit_message="Add complete dataset sequences" |
| ) |
| |
| |
| print("π€ Creating comprehensive summary...") |
| |
| |
| uploaded_files = { |
| "model_components": len([f for f in model_files if os.path.exists(f)]), |
| "weight_files": len([f for f, _ in weight_files if os.path.exists(f)]), |
| "checkpoints": len([f for f, _ in checkpoint_files if os.path.exists(f)]), |
| "paper_files": len([f for f in paper_files if os.path.exists(f)]), |
| "training_logs": len([f for f in log_files if os.path.exists(f)]), |
| "datasets": len([f for f, _ in dataset_files if os.path.exists(f)]), |
| "results": len([f for f in result_files if os.path.exists(f)]), |
| "embeddings": len([f for f in embedding_files if os.path.exists(os.path.join(embedding_dir, f))]), |
| "decoded_sequences": len([f for f in decoded_files if os.path.exists(os.path.join(decoded_dir, f))]), |
| "apex_results": len([f for f in apex_files if os.path.exists(os.path.join(apex_dir, f))]) |
| } |
| |
| summary = { |
| "model_name": "FlowFinal", |
| "upload_date": datetime.now().isoformat(), |
| "training_date": today, |
| "total_sequences_generated": 80, |
| "hmd_amp_predictions": 7, |
| "hmd_amp_rate": 8.8, |
| "best_cfg_configuration": "strong_cfg (20% AMP rate)", |
| "training_details": { |
| "epochs": 2000, |
| "final_loss": 1.318, |
| "training_time": "2.3 hours", |
| "hardware": "H100", |
| "dataset_size": 6983 |
| }, |
| "uploaded_files": uploaded_files, |
| "total_files_uploaded": sum(uploaded_files.values()), |
| "repository_structure": { |
| "src/": "Main model implementation files", |
| "models/": "Trained model weights and checkpoints", |
| "paper/": "LaTeX files and paper documentation", |
| "training_logs/": "Complete training logs and scripts", |
| "datasets/": "Training datasets and protein sequences", |
| "results/": "Generated sequences and validation results", |
| "generated_samples/": "Raw embeddings and decoded sequences", |
| "analysis/": "APEX antimicrobial activity analysis" |
| } |
| } |
| |
| with open("comprehensive_summary.json", "w") as f: |
| json.dump(summary, f, indent=2) |
| |
| upload_file( |
| path_or_fileobj="comprehensive_summary.json", |
| path_in_repo="comprehensive_summary.json", |
| repo_id=repo_id, |
| commit_message="Add comprehensive model and results summary" |
| ) |
| |
| print("β
Comprehensive upload complete!") |
| print(f"π Your complete FlowFinal repository is now available at: https://huggingface.co/{repo_id}") |
| print("\nπ Upload Summary:") |
| for category, count in uploaded_files.items(): |
| print(f" - {category.replace('_', ' ').title()}: {count} files") |
| print(f" - Total files uploaded: {sum(uploaded_files.values())} files") |
| print(f"\nπ― Key Results:") |
| print(f" - Generated 80 sequences with different CFG scales") |
| print(f" - HMD-AMP validated 7 sequences as AMPs (8.8% success rate)") |
| print(f" - Strong CFG (7.5) performed best with 20% AMP rate") |
| print(f" - Complete training logs, datasets, and analysis included") |
| print(f" - Ready for final paper submission!") |
|
|
| if __name__ == "__main__": |
| main() |