| --- |
| license: apache-2.0 |
| base_model: |
| - nvidia/Alpamayo-R1-10B |
| --- |
| nvidia/Alpamayo-R1-10B 4bit Model. |
|
|
| ์ด๋ชจ๋ธ์ ์์จ์ฃผํ ์ค ์์ง๋ ๋ฐ์ดํฐ๋ก ์ด๋ฒคํธ๋ฅผ ์์ธกํ๋ ์ฉ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค. |
| ์์จ์ฃผํ์ ํ๋๊ฒ ์๋๋ผ ์์จ์ฃผํ ์ค ํน์ ์ํฉ์ด ๋ฐ์ํ ๊ฒ์ ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค. |
|
|
|
|
| ```Runinfo |
| model download ./Alpamayo-R1-10B-4bit |
| |
| GPU 12G/16G Memory Run able |
| |
| 12G Memory is num_frames is 1 ~ 8, over OOM |
| |
| Transformers is 4.57.5 ( 5.0.0rc not run) |
| |
| nvidia/Alpamayo-R1-10B ์ด ๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ตฌํ๊ณ 4bit ๋ก ๋ก๋ฉํ์ฌ ์ ์ฅํ ๋ชจ๋ธ์
๋๋ค. |
| 12G ์์๋ ์คํ๊ฐ๋ฅํด์ก์ต๋๋ค๋ง ์ฃผ์ด์ง๋ ํ๋ ์์๋ 1~8์ ๋, ๊ทธ ์ด์์ด๋ฉด OOM์ด ๋จ์ด์ง๋๋ค. |
| ํธ๋์คํฌ๋จธ ๋ฒ์ 5.0.0rc์์๋ ๋์ํ์ง ์์ต๋๋ค. |
| |
| git clone https://github.com/NVlabs/alpamayo ํ๊ณ |
| cd alpamayo |
| pip install . ๋ก ์ค์นํด์ผ ํฉ๋๋ค๋ง |
| |
| pyproject.toml์ ์์ ํ๋๊ฒ ์ข์ต๋๋ค. |
| python 3.13์ ์ฌ์ฉํ๋ฉด requires-python = "==3.13.*" |
| transformers ์ torch๋ฅผ ๋ผ์ธ์ ์ ๊ฑฐํ๊ณ ์ค์นํ๋ฉด ์ค์น๋ ๋ฒ์ ์ด ๊ต์ฒด๋์ง ์์ต๋๋ค. |
| ``` |
| ----------------------------------- |
| ```python |
| import torch |
| import numpy as np |
| from alpamayo_r1.models.alpamayo_r1 import AlpamayoR1 |
| from alpamayo_r1.load_physical_aiavdataset import load_physical_aiavdataset |
| from alpamayo_r1 import helper |
| |
| model_path = "Alpamayo-R1-10B-4bit" |
| model = AlpamayoR1.from_pretrained(model_path, dtype=torch.bfloat16).to("cuda") |
| |
| processor = helper.get_processor(model.tokenizer) |
| |
| clip_id = "030c760c-ae38-49aa-9ad8-f5650a545d26" |
| print(f"Loading dataset for clip_id: {clip_id}...") |
| #need set access token or huggingface-cli login... |
| data = load_physical_aiavdataset(clip_id, t0_us=15_100_000,num_frames=1) |
| print("Dataset loaded.") |
| |
| messages = helper.create_message(data["image_frames"].flatten(0, 1)) |
| |
| inputs = processor.apply_chat_template( |
| messages, |
| tokenize=True, |
| add_generation_prompt=False, |
| continue_final_message=True, |
| return_dict=True, |
| return_tensors="pt", |
| ) |
| |
| model_inputs = { |
| "tokenized_data": inputs, |
| "ego_history_xyz": data["ego_history_xyz"], |
| "ego_history_rot": data["ego_history_rot"], |
| } |
| |
| model_inputs = helper.to_device(model_inputs, "cuda") |
| torch.cuda.manual_seed_all(42) |
| with torch.autocast("cuda", dtype=torch.bfloat16): |
| pred_xyz, pred_rot, extra = model.sample_trajectories_from_data_with_vlm_rollout( |
| data=model_inputs, |
| top_p=0.98, |
| temperature=0.6, |
| num_traj_samples=1, # Feel free to raise this for more output trajectories and CoC traces. |
| max_generation_length=256, |
| return_extra=True, |
| ) |
| |
| |
| print("Chain-of-Causation (per trajectory):\n", extra["cot"][0]) |
| gt_xy = data["ego_future_xyz"].cpu()[0, 0, :, :2].T.numpy() |
| pred_xy = pred_xyz.cpu().numpy()[0, 0, :, :, :2].transpose(0, 2, 1) |
| diff = np.linalg.norm(pred_xy - gt_xy[None, ...], axis=1).mean(-1) |
| min_ade = diff.min() |
| print("minADE:", min_ade, "meters") |
| print( |
| "Note: VLA-reasoning models produce nondeterministic outputs due to trajectory sampling, " |
| "hardware differences, etc. With num_traj_samples=1 (set for GPU memory compatibility), " |
| "variance in minADE is expected. For visual sanity checks, see notebooks/inference.ipynb" |
| ) |
| ``` |
| -------------------- |
| ```Result: |
| |
| |
| Chain-of-Causation (per trajectory): |
| [['Nudge to the left to pass the stopped truck encroaching into the lane.']] |
| minADE: 1.7749525 meters |
| Note: VLA-reasoning models produce nondeterministic outputs due to trajectory sampling, hardware differences, etc. With num_traj_samples=1 (set for GPU memory compatibility), variance in minADE is expected. For visual sanity checks, see notebooks/inference.ipynb |
| ``` |
|
|
|
|
| ๋๋ 1์ฅ์ ์ด๋ฏธ์ง๋ก ํ๋
ํ๋ ๊ฒ์ ํ
์คํธ ํ๋ ค๊ณ ์๋์ ๊ฐ์ ์์ ๋ฅผ ๋ง๋ค์๋ค. |
| ๋ฐ์ดํฐ ๋ก๋ฉ ์์ด ๊ธฐ๋ณธ ์ด๊ธฐํ๋ฅผ ํ์ฌ ์์์ ์์ ์์ํ๋ ๊ฒ์์ ์์ํ๋ค. |
| ๊ตฌ๋ํ๊ธฐ ์ํด์ ์ต์ 12G ์ด์์ธ GPU์นด๋๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ , ์๋ต์๋ ๋ ๊ฝค ์ง์ฐ์ด ๊ฑธ๋ ค |
| ์ค์ ์๋์ฐจ์ ์ ์ฉํ๊ธฐ์ ๋ฌด๋ฆฌ์ธ๊ฒ ๊ฐ๋ค. |
|
|
| ```python |
| #ZeroTime init Base Image(1 photo on load image) |
| import torch |
| import numpy as np |
| from PIL import Image |
| from alpamayo_r1.models.alpamayo_r1 import AlpamayoR1 |
| from alpamayo_r1.load_physical_aiavdataset import load_physical_aiavdataset |
| from alpamayo_r1 import helper |
| |
| num_history_steps = 16 # ๊ณผ๊ฑฐ ์คํ
์ |
| num_future_steps = 64 # ๋ฏธ๋ ์คํ
์ |
| |
| # ๋๋ฏธ ์์น ๋ฐ์ดํฐ (xyz ์ขํ) |
| ego_history_xyz = torch.zeros((1, 1, num_history_steps, 3)) # (batch, agent, steps, xyz) |
| ego_future_xyz = torch.zeros((1, 1, num_future_steps, 3)) |
| |
| # ๋๋ฏธ ํ์ ๋ฐ์ดํฐ (3x3 ํ์ ํ๋ ฌ) |
| ego_history_rot = torch.eye(3).repeat(1, 1, num_history_steps, 1, 1) # (1,1,steps,3,3) |
| ego_future_rot = torch.eye(3).repeat(1, 1, num_future_steps, 1, 1) |
| |
| print("ego_history_xyz:", ego_history_xyz.shape) |
| print("ego_future_xyz:", ego_future_xyz.shape) |
| print("ego_history_rot:", ego_history_rot.shape) |
| print("ego_future_rot:", ego_future_rot.shape) |
| N_cameras = 1 |
| camera_indices = torch.arange(N_cameras, dtype=torch.long) # (N_cameras,) - long ํ์
๋ช
์ |
| |
| data={ |
| "camera_indices": camera_indices, # (N_cameras,) |
| "ego_history_xyz": ego_history_xyz, # (1, 1, num_history_steps, 3) |
| "ego_history_rot": ego_history_rot, # (1, 1, num_history_steps, 3, 3) |
| "ego_future_xyz": ego_future_xyz, # (1, 1, num_future_steps, 3) |
| "ego_future_rot": ego_future_rot, # (1, 1, num_future_steps, 3, 3) |
| # "relative_timestamps": relative_timestamps, # (N_cameras, num_frames) |
| # "absolute_timestamps": absolute_timestamps # (N_cameras, num_frames) |
| } |
| img_path = "IMG_20260116_065921.jpg" |
| # ์์ธกํ๊ณ ์ถ์ JPG ํ์ผ ๊ฒฝ๋ก |
| image = Image.open(img_path).convert("RGB") |
| # helper.create_message๋ tensor ์
๋ ฅ์ ๊ธฐ๋ํ๋ฏ๋ก ๋ณํ |
| # PIL Image๋ฅผ numpy array๋ก ๋ณํ ํ float32๋ก ๋ณํ |
| image_array = np.array(image).astype(np.float32) / 255.0 # 0-1 ๋ฒ์๋ก ์ ๊ทํ |
| image_tensor = torch.from_numpy(image_array).unsqueeze(0) # [batch, H, W, C] |
| # ๋ฉ์์ง ์์ฑ |
| messages = helper.create_message(image_tensor) |
| |
| # Example clip ID |
| model_path = "Alpamayo-R1-10B-4bit" |
| model = AlpamayoR1.from_pretrained(model_path, dtype=torch.bfloat16).to("cuda") |
| processor = helper.get_processor(model.tokenizer) |
| |
| |
| |
| # ์ค์ ๊ฐ |
| |
| inputs = processor.apply_chat_template( |
| messages, |
| tokenize=True, |
| add_generation_prompt=False, |
| continue_final_message=True, |
| return_dict=True, |
| return_tensors="pt", |
| ) |
| |
| model_inputs = { |
| "tokenized_data": inputs, |
| "ego_history_xyz": data["ego_history_xyz"], |
| "ego_history_rot": data["ego_history_rot"], |
| } |
| |
| model_inputs = helper.to_device(model_inputs, "cuda") |
| |
| torch.cuda.manual_seed_all(42) |
| with torch.autocast("cuda", dtype=torch.bfloat16): |
| pred_xyz, pred_rot, extra = model.sample_trajectories_from_data_with_vlm_rollout( |
| data=model_inputs, |
| top_p=0.98, |
| temperature=0.6, |
| num_traj_samples=1, # Feel free to raise this for more output trajectories and CoC traces. |
| max_generation_length=256, |
| return_extra=True, |
| ) |
| |
| # the size is [batch_size, num_traj_sets, num_traj_samples] |
| print("Chain-of-Causation (per trajectory):\n", extra["cot"][0]) |
| |
| gt_xy = data["ego_future_xyz"].cpu()[0, 0, :, :2].T.numpy() |
| pred_xy = pred_xyz.cpu().numpy()[0, 0, :, :, :2].transpose(0, 2, 1) |
| diff = np.linalg.norm(pred_xy - gt_xy[None, ...], axis=1).mean(-1) |
| min_ade = diff.min() |
| print("minADE:", min_ade, "meters") |
| print( |
| "Note: VLA-reasoning models produce nondeterministic outputs due to trajectory sampling, " |
| "hardware differences, etc. With num_traj_samples=1 (set for GPU memory compatibility), " |
| "variance in minADE is expected. For visual sanity checks, see notebooks/inference.ipynb" |
| ) |
| ``` |
|
|
| ```output |
| |
| Chain-of-Causation (per trajectory): |
| [['Keep lane to continue driving since the lane ahead is clear.']] |
| minADE: 0.55852604 meters |
| Note: VLA-reasoning models produce nondeterministic outputs due to trajectory sampling, hardware differences, etc. With num_traj_samples=1 (set for GPU memory compatibility), variance in minADE is expected. For visual sanity checks, see notebooks/inference.ipynb |
| |
| ``` |