Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
Commit
·
98b9e26
1
Parent(s):
bbb728a
check uma access on file upload
Browse files- app.py +2 -5
- gradio_molecule3d/backend/gradio_molecule3d/molecule3d.py +10 -7
- hf_calculator.py +10 -5
- simulation_scripts.py +6 -3
app.py
CHANGED
|
@@ -12,11 +12,8 @@ from pathlib import Path
|
|
| 12 |
|
| 13 |
import gradio as gr
|
| 14 |
|
| 15 |
-
from simulation_scripts import (
|
| 16 |
-
|
| 17 |
-
run_relaxation_simulation,
|
| 18 |
-
validate_ase_atoms_and_login,
|
| 19 |
-
)
|
| 20 |
|
| 21 |
DEFAULT_MOLECULAR_REPRESENTATIONS = [
|
| 22 |
{
|
|
|
|
| 12 |
|
| 13 |
import gradio as gr
|
| 14 |
|
| 15 |
+
from simulation_scripts import (run_md_simulation, run_relaxation_simulation,
|
| 16 |
+
validate_ase_atoms_and_login)
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
DEFAULT_MOLECULAR_REPRESENTATIONS = [
|
| 19 |
{
|
gradio_molecule3d/backend/gradio_molecule3d/molecule3d.py
CHANGED
|
@@ -9,8 +9,8 @@ from typing import TYPE_CHECKING, Any, Callable, Literal, Sequence
|
|
| 9 |
|
| 10 |
import gradio_client.utils as client_utils
|
| 11 |
from gradio_client import handle_file
|
| 12 |
-
from gradio_client.documentation import document
|
| 13 |
|
|
|
|
| 14 |
from gradio import processing_utils
|
| 15 |
from gradio.components.base import Component
|
| 16 |
from gradio.data_classes import FileData, ListFiles
|
|
@@ -107,7 +107,7 @@ def convert_file_to_pdb(file_path: str | Path, gradio_cache: str | Path) -> str:
|
|
| 107 |
structures = ase.io.read(file_path, ':')
|
| 108 |
except Exception as e:
|
| 109 |
# Bad upload structure, no need to visualize
|
| 110 |
-
|
| 111 |
|
| 112 |
if all(structures[0].pbc):
|
| 113 |
# find the minimum number of repeats in each unit cell direction to meet at least 20 angstroms
|
|
@@ -322,11 +322,14 @@ class Molecule3D(Component):
|
|
| 322 |
)
|
| 323 |
else:
|
| 324 |
value = convert_file_to_pdb(str(value), self.GRADIO_CACHE)
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
|
|
|
|
|
|
|
|
|
| 330 |
|
| 331 |
def process_example(self, value: str | list | None) -> str:
|
| 332 |
if value is None:
|
|
|
|
| 9 |
|
| 10 |
import gradio_client.utils as client_utils
|
| 11 |
from gradio_client import handle_file
|
|
|
|
| 12 |
|
| 13 |
+
import gradio as gr
|
| 14 |
from gradio import processing_utils
|
| 15 |
from gradio.components.base import Component
|
| 16 |
from gradio.data_classes import FileData, ListFiles
|
|
|
|
| 107 |
structures = ase.io.read(file_path, ':')
|
| 108 |
except Exception as e:
|
| 109 |
# Bad upload structure, no need to visualize
|
| 110 |
+
raise gr.Error(f'Error parsing file with ase: {str(e)}')
|
| 111 |
|
| 112 |
if all(structures[0].pbc):
|
| 113 |
# find the minimum number of repeats in each unit cell direction to meet at least 20 angstroms
|
|
|
|
| 322 |
)
|
| 323 |
else:
|
| 324 |
value = convert_file_to_pdb(str(value), self.GRADIO_CACHE)
|
| 325 |
+
if value is not None:
|
| 326 |
+
return FileData(
|
| 327 |
+
path=value,
|
| 328 |
+
orig_name=Path(value).name,
|
| 329 |
+
size=Path(value).stat().st_size,
|
| 330 |
+
)
|
| 331 |
+
else:
|
| 332 |
+
return None
|
| 333 |
|
| 334 |
def process_example(self, value: str | list | None) -> str:
|
| 335 |
if value is None:
|
hf_calculator.py
CHANGED
|
@@ -29,6 +29,14 @@ def hash_save_file(atoms: ase.Atoms, task_name, path: Path | str):
|
|
| 29 |
return
|
| 30 |
|
| 31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
class HFEndpointCalculator(Calculator):
|
| 33 |
# A simple calculator that uses the Hugging Face Inference Endpoints to run
|
| 34 |
|
|
@@ -47,15 +55,12 @@ class HFEndpointCalculator(Calculator):
|
|
| 47 |
# If we have an example structure, we don't need to check for authentication
|
| 48 |
# Otherwise, we need to check if the user is authenticated and has gated access to the UMA models
|
| 49 |
if not example:
|
| 50 |
-
|
| 51 |
-
hf_hub.HfApi().auth_check(
|
| 52 |
-
repo_id="facebook/UMA", token=oauth_token.token
|
| 53 |
-
)
|
| 54 |
try:
|
| 55 |
hash_save_file(atoms, task_name, "/data/custom_inputs/")
|
| 56 |
except FileNotFoundError:
|
| 57 |
pass
|
| 58 |
-
|
| 59 |
raise gr.Error(
|
| 60 |
"You need to log in to HF and have gated model access to UMA before running your own simulations!"
|
| 61 |
)
|
|
|
|
| 29 |
return
|
| 30 |
|
| 31 |
|
| 32 |
+
def validate_uma_access(oauth_token):
|
| 33 |
+
try:
|
| 34 |
+
hf_hub.HfApi().auth_check(repo_id="facebook/UMA", token=oauth_token.token)
|
| 35 |
+
return True
|
| 36 |
+
except (hf_hub.errors.HfHubHTTPError, AttributeError):
|
| 37 |
+
return False
|
| 38 |
+
|
| 39 |
+
|
| 40 |
class HFEndpointCalculator(Calculator):
|
| 41 |
# A simple calculator that uses the Hugging Face Inference Endpoints to run
|
| 42 |
|
|
|
|
| 55 |
# If we have an example structure, we don't need to check for authentication
|
| 56 |
# Otherwise, we need to check if the user is authenticated and has gated access to the UMA models
|
| 57 |
if not example:
|
| 58 |
+
if validate_uma_access(oauth_token):
|
|
|
|
|
|
|
|
|
|
| 59 |
try:
|
| 60 |
hash_save_file(atoms, task_name, "/data/custom_inputs/")
|
| 61 |
except FileNotFoundError:
|
| 62 |
pass
|
| 63 |
+
else:
|
| 64 |
raise gr.Error(
|
| 65 |
"You need to log in to HF and have gated model access to UMA before running your own simulations!"
|
| 66 |
)
|
simulation_scripts.py
CHANGED
|
@@ -23,7 +23,7 @@ from ase.md.velocitydistribution import MaxwellBoltzmannDistribution
|
|
| 23 |
from ase.md.verlet import VelocityVerlet
|
| 24 |
from ase.optimize import LBFGS
|
| 25 |
|
| 26 |
-
from hf_calculator import HFEndpointCalculator
|
| 27 |
|
| 28 |
|
| 29 |
def hash_file(file_path):
|
|
@@ -43,7 +43,9 @@ INFERENCE_ENDPOINT_URL = os.environ["INFERENCE_ENDPOINT_URL"]
|
|
| 43 |
|
| 44 |
|
| 45 |
def validate_ase_atoms_and_login(
|
| 46 |
-
structure_file: dict | str,
|
|
|
|
|
|
|
| 47 |
) -> tuple[gr.Button, gr.Button, str]:
|
| 48 |
# Validate and write the uploaded file content
|
| 49 |
if not structure_file:
|
|
@@ -84,7 +86,8 @@ def validate_ase_atoms_and_login(
|
|
| 84 |
f"Structure file contains {len(atoms)}, which is more than {MAX_ATOMS} atoms. Please use a smaller structure for this demo, or run this on a local machine!",
|
| 85 |
)
|
| 86 |
elif (hash_file(structure_file) not in EXAMPLE_FILE_HASHES) and (
|
| 87 |
-
"Logout" not in login_button_value
|
|
|
|
| 88 |
):
|
| 89 |
return (
|
| 90 |
gr.Button(interactive=False),
|
|
|
|
| 23 |
from ase.md.verlet import VelocityVerlet
|
| 24 |
from ase.optimize import LBFGS
|
| 25 |
|
| 26 |
+
from hf_calculator import HFEndpointCalculator, validate_uma_access
|
| 27 |
|
| 28 |
|
| 29 |
def hash_file(file_path):
|
|
|
|
| 43 |
|
| 44 |
|
| 45 |
def validate_ase_atoms_and_login(
|
| 46 |
+
structure_file: dict | str,
|
| 47 |
+
login_button_value: str,
|
| 48 |
+
oauth_token: gr.OAuthToken | None,
|
| 49 |
) -> tuple[gr.Button, gr.Button, str]:
|
| 50 |
# Validate and write the uploaded file content
|
| 51 |
if not structure_file:
|
|
|
|
| 86 |
f"Structure file contains {len(atoms)}, which is more than {MAX_ATOMS} atoms. Please use a smaller structure for this demo, or run this on a local machine!",
|
| 87 |
)
|
| 88 |
elif (hash_file(structure_file) not in EXAMPLE_FILE_HASHES) and (
|
| 89 |
+
("Logout" not in login_button_value)
|
| 90 |
+
or not validate_uma_access(oauth_token=oauth_token)
|
| 91 |
):
|
| 92 |
return (
|
| 93 |
gr.Button(interactive=False),
|