Spaces:
Build error
Build error
Upload folder using huggingface_hub
Browse files- run_transformers_training.py +87 -3
- update_space.py +32 -19
run_transformers_training.py
CHANGED
|
@@ -117,8 +117,9 @@ def load_env_variables():
|
|
| 117 |
# Try to load from .env file if not in a Space
|
| 118 |
try:
|
| 119 |
from dotenv import load_dotenv
|
| 120 |
-
#
|
| 121 |
-
env_path = os.path.join(os.path.dirname(os.path.
|
|
|
|
| 122 |
if os.path.exists(env_path):
|
| 123 |
load_dotenv(env_path)
|
| 124 |
logging.info(f"Loaded environment variables from {env_path}")
|
|
@@ -126,10 +127,22 @@ def load_env_variables():
|
|
| 126 |
logging.info(f"HF_USERNAME loaded from .env file: {bool(os.environ.get('HF_USERNAME'))}")
|
| 127 |
logging.info(f"HF_SPACE_NAME loaded from .env file: {bool(os.environ.get('HF_SPACE_NAME'))}")
|
| 128 |
else:
|
| 129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
except ImportError:
|
| 131 |
logging.warning("python-dotenv not installed, not loading from .env file")
|
| 132 |
|
|
|
|
|
|
|
|
|
|
| 133 |
if not os.environ.get("HF_USERNAME"):
|
| 134 |
logger.warning("HF_USERNAME is not set. Using default username.")
|
| 135 |
|
|
@@ -671,6 +684,70 @@ def check_dependencies():
|
|
| 671 |
|
| 672 |
return True
|
| 673 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 674 |
def main():
|
| 675 |
# Set up logging
|
| 676 |
logger.info("Starting training process")
|
|
@@ -686,6 +763,9 @@ def main():
|
|
| 686 |
# Load environment variables
|
| 687 |
load_env_variables()
|
| 688 |
|
|
|
|
|
|
|
|
|
|
| 689 |
# Load configuration
|
| 690 |
try:
|
| 691 |
transformers_config = load_configs(args.config)
|
|
@@ -941,6 +1021,10 @@ def main():
|
|
| 941 |
log_info(f"Pushing model to Hugging Face Hub as {hub_id}...")
|
| 942 |
trainer.push_to_hub()
|
| 943 |
log_info("Model successfully pushed to Hub")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 944 |
|
| 945 |
return 0
|
| 946 |
except Exception as e:
|
|
|
|
| 117 |
# Try to load from .env file if not in a Space
|
| 118 |
try:
|
| 119 |
from dotenv import load_dotenv
|
| 120 |
+
# First check the current directory
|
| 121 |
+
env_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env")
|
| 122 |
+
|
| 123 |
if os.path.exists(env_path):
|
| 124 |
load_dotenv(env_path)
|
| 125 |
logging.info(f"Loaded environment variables from {env_path}")
|
|
|
|
| 127 |
logging.info(f"HF_USERNAME loaded from .env file: {bool(os.environ.get('HF_USERNAME'))}")
|
| 128 |
logging.info(f"HF_SPACE_NAME loaded from .env file: {bool(os.environ.get('HF_SPACE_NAME'))}")
|
| 129 |
else:
|
| 130 |
+
# Try the shared directory as fallback
|
| 131 |
+
shared_env_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "shared", ".env")
|
| 132 |
+
if os.path.exists(shared_env_path):
|
| 133 |
+
load_dotenv(shared_env_path)
|
| 134 |
+
logging.info(f"Loaded environment variables from {shared_env_path}")
|
| 135 |
+
logging.info(f"HF_TOKEN loaded from shared .env file: {bool(os.environ.get('HF_TOKEN'))}")
|
| 136 |
+
logging.info(f"HF_USERNAME loaded from shared .env file: {bool(os.environ.get('HF_USERNAME'))}")
|
| 137 |
+
logging.info(f"HF_SPACE_NAME loaded from shared .env file: {bool(os.environ.get('HF_SPACE_NAME'))}")
|
| 138 |
+
else:
|
| 139 |
+
logging.warning(f"No .env file found in current or shared directory")
|
| 140 |
except ImportError:
|
| 141 |
logging.warning("python-dotenv not installed, not loading from .env file")
|
| 142 |
|
| 143 |
+
if not os.environ.get("HF_TOKEN"):
|
| 144 |
+
logger.warning("HF_TOKEN is not set. Pushing to Hugging Face Hub will not work.")
|
| 145 |
+
|
| 146 |
if not os.environ.get("HF_USERNAME"):
|
| 147 |
logger.warning("HF_USERNAME is not set. Using default username.")
|
| 148 |
|
|
|
|
| 684 |
|
| 685 |
return True
|
| 686 |
|
| 687 |
+
def update_huggingface_space():
|
| 688 |
+
"""Update the Hugging Face Space with the current code."""
|
| 689 |
+
log_info("Updating Hugging Face Space...")
|
| 690 |
+
update_script = os.path.join(os.path.dirname(os.path.abspath(__file__)), "update_space.py")
|
| 691 |
+
|
| 692 |
+
if not os.path.exists(update_script):
|
| 693 |
+
logger.warning(f"Update space script not found at {update_script}")
|
| 694 |
+
return False
|
| 695 |
+
|
| 696 |
+
try:
|
| 697 |
+
import subprocess
|
| 698 |
+
result = subprocess.run([sys.executable, update_script, "--force"],
|
| 699 |
+
capture_output=True, text=True, check=False)
|
| 700 |
+
|
| 701 |
+
if result.returncode == 0:
|
| 702 |
+
log_info("Hugging Face Space updated successfully!")
|
| 703 |
+
log_info(f"Space URL: https://huggingface.co/spaces/{os.environ.get('HF_USERNAME', 'George-API')}/{os.environ.get('HF_SPACE_NAME', 'phi4training')}")
|
| 704 |
+
return True
|
| 705 |
+
else:
|
| 706 |
+
logger.error(f"Failed to update Hugging Face Space: {result.stderr}")
|
| 707 |
+
return False
|
| 708 |
+
except Exception as e:
|
| 709 |
+
logger.error(f"Error updating Hugging Face Space: {str(e)}")
|
| 710 |
+
return False
|
| 711 |
+
|
| 712 |
+
def validate_huggingface_credentials():
|
| 713 |
+
"""Validate Hugging Face credentials to ensure they work correctly."""
|
| 714 |
+
if not os.environ.get("HF_TOKEN"):
|
| 715 |
+
logger.warning("HF_TOKEN not found. Skipping Hugging Face credentials validation.")
|
| 716 |
+
return False
|
| 717 |
+
|
| 718 |
+
try:
|
| 719 |
+
# Import here to avoid requiring huggingface_hub if not needed
|
| 720 |
+
from huggingface_hub import HfApi, login
|
| 721 |
+
|
| 722 |
+
# Try to login with the token
|
| 723 |
+
login(token=os.environ.get("HF_TOKEN"))
|
| 724 |
+
|
| 725 |
+
# Check if we can access the API
|
| 726 |
+
api = HfApi()
|
| 727 |
+
username = os.environ.get("HF_USERNAME", "George-API")
|
| 728 |
+
space_name = os.environ.get("HF_SPACE_NAME", "phi4training")
|
| 729 |
+
|
| 730 |
+
# Try to get whoami info
|
| 731 |
+
user_info = api.whoami()
|
| 732 |
+
logger.info(f"Successfully authenticated with Hugging Face as {user_info['name']}")
|
| 733 |
+
|
| 734 |
+
# Check if the space exists
|
| 735 |
+
try:
|
| 736 |
+
space_id = f"{username}/{space_name}"
|
| 737 |
+
space_info = api.space_info(repo_id=space_id)
|
| 738 |
+
logger.info(f"Space {space_id} is accessible")
|
| 739 |
+
return True
|
| 740 |
+
except Exception as e:
|
| 741 |
+
logger.warning(f"Could not access Space {username}/{space_name}: {str(e)}")
|
| 742 |
+
logger.warning("Space updating may not work correctly")
|
| 743 |
+
return False
|
| 744 |
+
except ImportError:
|
| 745 |
+
logger.warning("huggingface_hub not installed. Cannot validate Hugging Face credentials.")
|
| 746 |
+
return False
|
| 747 |
+
except Exception as e:
|
| 748 |
+
logger.warning(f"Error validating Hugging Face credentials: {str(e)}")
|
| 749 |
+
return False
|
| 750 |
+
|
| 751 |
def main():
|
| 752 |
# Set up logging
|
| 753 |
logger.info("Starting training process")
|
|
|
|
| 763 |
# Load environment variables
|
| 764 |
load_env_variables()
|
| 765 |
|
| 766 |
+
# Validate Hugging Face credentials if we're going to use them
|
| 767 |
+
validate_huggingface_credentials()
|
| 768 |
+
|
| 769 |
# Load configuration
|
| 770 |
try:
|
| 771 |
transformers_config = load_configs(args.config)
|
|
|
|
| 1021 |
log_info(f"Pushing model to Hugging Face Hub as {hub_id}...")
|
| 1022 |
trainer.push_to_hub()
|
| 1023 |
log_info("Model successfully pushed to Hub")
|
| 1024 |
+
|
| 1025 |
+
# Update the Hugging Face Space with current code
|
| 1026 |
+
if os.environ.get("HF_TOKEN") and os.environ.get("HF_USERNAME") and os.environ.get("HF_SPACE_NAME"):
|
| 1027 |
+
update_huggingface_space()
|
| 1028 |
|
| 1029 |
return 0
|
| 1030 |
except Exception as e:
|
update_space.py
CHANGED
|
@@ -204,30 +204,43 @@ def create_space(username, space_name):
|
|
| 204 |
raise RuntimeError(f"Error with Space {space_id}: {str(e)}")
|
| 205 |
|
| 206 |
def main():
|
| 207 |
-
|
| 208 |
-
parser.add_argument('--space_name', type=str, help='Space name (default: from env)')
|
| 209 |
-
parser.add_argument('--force', action='store_true', help='Skip confirmation')
|
| 210 |
-
args = parser.parse_args()
|
| 211 |
-
|
| 212 |
-
if not args.force:
|
| 213 |
-
print("\n" + "!"*80)
|
| 214 |
-
print("WARNING: Updating the Space will INTERRUPT any ongoing training!")
|
| 215 |
-
print("Make sure all checkpoints are saved before proceeding.")
|
| 216 |
-
print("!"*80 + "\n")
|
| 217 |
-
|
| 218 |
-
confirm = input("Type 'update' to confirm: ")
|
| 219 |
-
if confirm.lower() != 'update':
|
| 220 |
-
logger.info("Update cancelled")
|
| 221 |
-
return False
|
| 222 |
-
|
| 223 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 224 |
# Load environment variables
|
| 225 |
env_vars = load_env_variables()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 226 |
logger.info(f"Environment variables loaded: USERNAME={env_vars['HF_USERNAME']}, SPACE_NAME={env_vars['HF_SPACE_NAME']}")
|
| 227 |
|
| 228 |
-
#
|
| 229 |
-
|
| 230 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 231 |
|
| 232 |
# Update requirements
|
| 233 |
update_requirements()
|
|
|
|
| 204 |
raise RuntimeError(f"Error with Space {space_id}: {str(e)}")
|
| 205 |
|
| 206 |
def main():
|
| 207 |
+
"""Main function to update the Space."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 208 |
try:
|
| 209 |
+
# Parse command line arguments
|
| 210 |
+
parser = argparse.ArgumentParser(description='Update Hugging Face Space for Phi-4 training')
|
| 211 |
+
parser.add_argument('--space_name', type=str, help='Space name (default: from env)')
|
| 212 |
+
parser.add_argument('--force', action='store_true', help='Skip confirmation when updating Space')
|
| 213 |
+
args = parser.parse_args()
|
| 214 |
+
|
| 215 |
# Load environment variables
|
| 216 |
env_vars = load_env_variables()
|
| 217 |
+
verify_configs()
|
| 218 |
+
|
| 219 |
+
# Verify we have the necessary variables
|
| 220 |
+
if not all(k in env_vars and env_vars[k] for k in ["HF_TOKEN", "HF_USERNAME", "HF_SPACE_NAME"]):
|
| 221 |
+
logger.error("Missing required environment variables. Please check your .env file.")
|
| 222 |
+
logger.error(f"HF_TOKEN: {'Set' if 'HF_TOKEN' in env_vars and env_vars['HF_TOKEN'] else 'Not Set'}")
|
| 223 |
+
logger.error(f"HF_USERNAME: {'Set' if 'HF_USERNAME' in env_vars and env_vars['HF_USERNAME'] else 'Not Set'}")
|
| 224 |
+
logger.error(f"HF_SPACE_NAME: {'Set' if 'HF_SPACE_NAME' in env_vars and env_vars['HF_SPACE_NAME'] else 'Not Set'}")
|
| 225 |
+
return False
|
| 226 |
+
|
| 227 |
logger.info(f"Environment variables loaded: USERNAME={env_vars['HF_USERNAME']}, SPACE_NAME={env_vars['HF_SPACE_NAME']}")
|
| 228 |
|
| 229 |
+
# Ask for confirmation unless forced
|
| 230 |
+
if not args.force:
|
| 231 |
+
print("\nWARNING: Updating the Space will INTERRUPT any ongoing training!")
|
| 232 |
+
confirm = input("Are you sure you want to update the Space? Type 'yes' to confirm: ")
|
| 233 |
+
if confirm.lower() != 'yes':
|
| 234 |
+
logger.info("Update cancelled by user")
|
| 235 |
+
return False
|
| 236 |
+
|
| 237 |
+
# Additional password check for safety
|
| 238 |
+
password = getpass.getpass("Enter your password to confirm update: ")
|
| 239 |
+
if password.strip() == "":
|
| 240 |
+
logger.info("No password entered. Update cancelled.")
|
| 241 |
+
return False
|
| 242 |
+
else:
|
| 243 |
+
logger.info("Skipping confirmation due to --force flag")
|
| 244 |
|
| 245 |
# Update requirements
|
| 246 |
update_requirements()
|