-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbundle_weight.py
65 lines (56 loc) · 2.47 KB
/
bundle_weight.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import argparse
import os
import subprocess
from pathlib import Path
from mlc_llm.support import logging
logging.enable_logging()
logger = logging.getLogger(__name__)
def main(apk_path: Path, package_output_path: Path):
"""Push weights to the android device with adb"""
# - Install the apk on device.
logger.info('Install apk "%s" to device', str(apk_path.absolute()))
subprocess.run(["adb", "install", str(apk_path)], check=True, env=os.environ)
# - Create the weight directory for the app.
device_weihgt_dir = "/storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"
logger.info('Creating directory "%s" on device', device_weihgt_dir)
subprocess.run(
["adb", "shell", "mkdir", "-p", device_weihgt_dir],
check=True,
env=os.environ,
)
for model_weight_dir in (package_output_path / "bundle").iterdir():
if model_weight_dir.is_dir():
src_path = str(model_weight_dir.absolute())
dst_path = "/data/local/tmp/" + model_weight_dir.name
logger.info('Pushing local weights "%s" to device location "%s"', src_path, dst_path)
subprocess.run(["adb", "push", src_path, dst_path], check=True, env=os.environ)
src_path = dst_path
dst_path = "/storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"
logger.info('Move weights from "%s" to "%s"', src_path, dst_path)
subprocess.run(["adb", "shell", "mv", src_path, dst_path], check=True, env=os.environ)
logger.info("All finished.")
if __name__ == "__main__":
parser = argparse.ArgumentParser("MLC LLM Android Weight Bundle")
def _parse_apk_path(path: str) -> Path:
path = Path(path)
if not path.exists():
raise ValueError(
f"Path {str(path)} is expected to be an apk file, but the file does not exist."
)
if not path.is_file():
raise ValueError(f"Path {str(path)} is expected to be an apk file.")
return path
parser.add_argument(
"--apk-path",
type=_parse_apk_path,
default="app/release/app-release.apk",
help="The path to generated MLCChat apk file.",
)
parser.add_argument(
"--package-output-path",
type=Path,
default="dist",
help='The path to the output directory of "mlc_llm package".',
)
args = parser.parse_args()
main(args.apk_path, args.package_output_path)