บันทึก, ฝึกฝน และนำไปใช้งานจริง จากที่เดียว ด้วย Strands Agents, LeRobot และ Hugging Face Storage Buckets

คุณมีเอเจนต์ที่สามารถบันทึกการสาธิตและส่งไปยัง Hugging Face Hub ได้แล้ว ตอนนี้คุณต้องการให้กระบวนการนี้ทำงานอย่างต่อเนื่อง: รวบรวมข้อมูลจากช่วงเวลาต่างๆ ตลอดทั้งวัน ฝึกฝนโมเดล (policy) จากชุดข้อมูลที่เติบโตขึ้น นำไปใช้งานจริง และดึงชุดข้อมูลถัดไปมาปรับปรุงให้ดียิ่งขึ้น หากทำขั้นตอนนี้เพียงครั้งเดียว ทุกอย่างจะทำงานได้ แต่ถ้าทำทุกวัน คุณจะเริ่มเสียค่าใช้จ่ายในการถ่ายโอนข้อมูลเดิมซ้ำๆ การบันทึกที่คุณอัปโหลดจะเพิ่มขึ้นเรื่อยๆ การฝึกแต่ละครั้งจะคัดลอกชุดข้อมูลทั้งหมดไปยัง GPU ก่อนเริ่มทำงาน และทุกๆ เช็คพอยต์ใหม่จะถูกส่งออกไปพร้อมๆ กับการดึงข้อมูลชุดถัดไปกลับมา

โพสต์ก่อนหน้านี้ในซีรีส์นี้ได้แนะนำ Strands Robots ซึ่งเป็น SDK แบบโอเพนซอร์สจาก AWS (Apache 2.0) ที่เปิดเผยการทำงานของหุ่นยนต์ การจำลอง และสแต็ก LeRobot ในรูปแบบ AgentTools ที่คุณสามารถนำมาประกอบกันเป็น Strands agent เดียวกัน โพสต์นั้นได้กล่าวถึง Robot() factory, การบันทึกการสาธิตในการจำลอง, การรัน policy, และการนำโค้ด agent เดียวกันไปใช้งานจริงบนหุ่นยนต์ SO-101 โดย Robot() factory นี้จะค้นหาชื่อเทียบกับ registry ของแขน, หุ่นยนต์ฮิวแมนนอยด์, ฐานเคลื่อนที่ และมือ ทำให้ SO-100 ที่ใช้ในโพสต์นี้เป็นเพียงหนึ่งในรูปแบบที่รองรับหลายรูปแบบ แคตตาล็อกหุ่นยนต์จะแสดงรายการหุ่นยนต์ทั้งหมดที่ factory รู้จัก LeRobot ใช้รูปแบบชุดข้อมูลที่ถูกใช้แล้วมากกว่า 90,000 ชุดข้อมูลและโมเดลบน Hub จากผู้เผยแพร่กว่า 8,000 ราย (LeRobot Project Pulse) การบันทึกของ Strands Robots ก็เป็นหนึ่งในนั้นเช่นกัน ดังนั้น สิ่งใดก็ตามที่ถูกสร้างขึ้นมาเพื่ออ่านข้อมูล LeRobot จะสามารถอ่านข้อมูลนี้ได้โดยไม่ต้องแปลง หากคุณยังใหม่กับ Strands Robots ควรเริ่มต้นจากตรงนั้นก่อน โพสต์นี้จะถือว่าคุณได้ตั้งค่าพื้นฐานเหล่านั้นแล้ว

โพสต์นั้นได้ติดตาม agent loop ไปในทิศทางเดียว จากชุดข้อมูลบน Hub ไปยังหุ่นยนต์จริง โพสต์นี้จะติดตามข้อมูลในทิศทางตรงกันข้าม จากเฟรมแรกที่บันทึกกลับไปยัง policy ที่นำไปใช้งานจริง ผ่าน Hugging Face Storage Buckets ซึ่งเป็นที่เก็บข้อมูลแบบออบเจกต์ที่สามารถเปลี่ยนแปลงได้ ไม่มีการทำเวอร์ชัน และใช้ Xet เป็นแบ็กเอนด์ ซึ่งประกาศเมื่อเดือนมีนาคม 2026 บัคเก็ตจะอยู่เคียงข้างกับ repository ของชุดข้อมูลของคุณใน namespace hf:// เดียวกัน และใช้ hf CLI ที่คุณมีอยู่แล้ว ดังนั้น มันจะกลายเป็นชั้นการทำงานที่เก็บข้อมูลของคุณตั้งแต่ที่คุณบันทึกไปจนถึงวันที่คุณฝึกฝน

ใครสักคนต้องตัดสินใจว่าจะเก็บ episode ใดไว้ เมื่อฉากมีการเปลี่ยนแปลงมากพอที่จะต้องบันทึกใหม่ วันนี้มีข้อมูลเพียงพอที่จะฝึกฝนหรือไม่ และเช็คพอยต์ใดที่จะมาแทนที่ตัวที่อยู่บนแขน การตัดสินใจเหล่านี้เกิดขึ้นซ้ำๆ หลายสิบครั้งตลอดการเก็บข้อมูล และแต่ละครั้งต้องการการตรวจสอบสิ่งที่ได้รับกลับมาก่อนที่จะส่งคำสั่งถัดไป นั่นคืองานของ agent โพสต์นี้จะแนะนำคุณตลอด data loop ภายใน agent เดียวกัน: บันทึกการสาธิตลงใน Storage Bucket, จัดเก็บข้อมูลเพื่อให้การซิงค์แต่ละครั้งอัปโหลดเฉพาะไบต์ที่เปลี่ยนแปลง, ฝึกฝนโดยการสตรีมชุดข้อมูลโดยตรงจาก Hub แทนที่จะดาวน์โหลด, และนำเช็คพอยต์ไปใช้งานจริงบนฮาร์ดแวร์ด้วยการเปลี่ยนแปลง keyword argument เพียงเล็กน้อย ส่วนที่สามารถรันได้ของโพสต์นี้อยู่ที่ examples/notebooks/05streamingdata_loop.ipynb

ในขณะที่โพสต์แรกบันทึกชุดข้อมูลและส่งไปยัง Hub เอเจนต์ที่คุณสร้างขึ้นที่นี่จะบันทึก LeRobotDataset จากข้อความภาษาธรรมชาติ, ซิงค์เข้าไปใน Storage Bucket, และสตรีมชุดข้อมูลเดียวกันนั้นกลับมาทีละเฟรม, ถอดรหัสวิดีโอจากกล้องแบบเรียลไทม์ โดยไม่ต้องคัดลอกข้อมูลมาไว้ที่เครื่อง คุณอ่านมันกลับมาในกระบวนการเดียวกับที่เขียนมัน: Strands Robots Robot() เดียวกันที่บันทึกชุดข้อมูล ก็จะสตรีมข้อมูลนั้นออกมา เช็คพอยต์ที่ฝึกฝนแล้วจะถูกนำไปใช้งานจริงกับ Robot() ตัวเดียวกันด้วยการเปลี่ยนแปลง keyword argument เพียงเล็กน้อย และการสาธิตที่มันบันทึกบนฮาร์ดแวร์จะกลับไปยังบัคเก็ตเดิม

![Figure 1: The four stages share one backend. Robot("so100") records a LeRobotDataset through the shared DatasetRecorder; syncdatasettobucket(...) syncs it into a Storage Bucket; streamdataset(...) reads it back over the Hub with no full download; and the trained checkpoint deploys to the same Robot with mode="real". The on-disk format stays exactly as LeRobot wrote it.](ขอบคุณ แหล่งข้อมูล
https://huggingface.co/blog/amazon/strands-lerobot-streaming-data-loop/raw/main/figure1.png)
รูปที่ 1: สี่ขั้นตอนใช้แบ็กเอนด์เดียวกัน Robot("so100") บันทึก LeRobotDataset ผ่าน DatasetRecorder ที่ใช้ร่วมกัน; syncdatasettobucket(...) ซิงค์เข้าไปใน Storage Bucket; streamdataset(...) อ่านกลับมาผ่าน Hub โดยไม่ต้องดาวน์โหลดทั้งหมด; และเช็คพอยต์ที่ฝึกฝนแล้วจะถูกนำไปใช้งานจริงกับ Robot ตัวเดียวกันด้วยโหมด "real" รูปแบบบนดิสก์ยังคงเหมือนเดิมที่ LeRobot เขียนไว้

เนื่องจาก Robot() ตัวเดียวทั้งบันทึกชุดข้อมูลและอ่านกลับมา การรวบรวมข้อมูลและการฝึกฝนจึงเป็นสองเมธอดบนออบเจกต์เดียวผ่านแบ็กเอนด์เดียว เอเจนต์จะตัดสินใจรัน episode และเรียกใช้ tool หนึ่งตัว จากนั้น rollout จะดำเนินต่อไปตามความถี่การควบคุมของหุ่นยนต์จนกว่า episode จะสิ้นสุด โดยมี trained policy เป็นผู้สร้างการกระทำทุกอย่าง วงจรทั้งหมดนี้ทำได้ในไม่กี่บรรทัด:

สิ่งที่ตามมาคือสิ่งที่เกิดขึ้นจริงภายในวงจรนั้น ทีละขั้นตอน

สิ่งที่ต้องเตรียมก่อนเริ่ม

  • Python 3.12+ บน Linux หรือ macOS (รองรับ Apple Silicon สำหรับ MuJoCo backend)
  • ผู้ให้บริการโมเดลที่เข้ากันได้กับ Strands สำหรับการให้เหตุผลของเอเจนต์ เช่น Amazon Bedrock พร้อม AWS credentials, Anthropic API, OpenAI, หรือ Ollama ที่รันบนเครื่อง
  • Strands Robots พร้อมส่วนเสริม dataset: uv pip install -U "strands-robots[sim-mujoco,lerobot]>=0.5.1" ส่วนเสริม lerobot จะดึง LeRobot (>=0.6.1), datasets, av, และ torchcodec มาให้ ทำให้การบันทึกและถอดรหัสวิดีโอทำงานได้โดยไม่ต้องตั้งค่าเพิ่มเติม ดูคู่มือการติดตั้ง
  • ทั้งหมดนี้สามารถรันบนแล็ปท็อปได้ สิ่งที่รันคือ loop ไม่ใช่ policy ที่ใช้งานได้จริง: โดยค่าเริ่มต้นจะใช้ mock policy ซึ่งจะบันทึกชุดข้อมูลที่ถูกต้องแต่ไม่เป็นประโยชน์
  • บัญชี Hugging Face และโทเค็นที่มีสิทธิ์เขียน รวมถึง hf CLI สำหรับสร้างบัคเก็ตและซิงค์ชุดข้อมูล: `pip install -U "huggingface-hub>=1.6.0,

ขอบคุณ แหล่งข้อมูล
https://huggingface.co/blog/amazon/strands-lerobot-streaming-data-loop

บันทึก, ฝึกฝน และนำไปใช้งานจริง จากที่เดียว ด้วย Strands Agents, LeRobot และ Hugging Face Storage Bucketsคุณมีเอเจนต์ที่สามารถบันทึกการสาธิตและส่งไปยัง Hugging Face Hub ได้แล้ว ตอนนี้คุณต้องการให้กระบวนการนี้ทำงานอย่างต่อเนื่อง: รวบรวมข้อมูลจากช่วงเวลาต่างๆ ตลอดทั้งวัน ฝึกฝนโมเดล (policy) จากชุดข้อมูลที่เติบโตขึ้น นำไปใช้งานจริง และดึงชุดข้อมูลถัดไปมาปรับปรุงให้ดียิ่งขึ้น หากทำขั้นตอนนี้เพียงครั้งเดียว ทุกอย่างจะทำงานได้ แต่ถ้าทำทุกวัน คุณจะเริ่มเสียค่าใช้จ่ายในการถ่ายโอนข้อมูลเดิมซ้ำๆ การบันทึกที่คุณอัปโหลดจะเพิ่มขึ้นเรื่อยๆ การฝึกแต่ละครั้งจะคัดลอกชุดข้อมูลทั้งหมดไปยัง GPU ก่อนเริ่มทำงาน และทุกๆ เช็คพอยต์ใหม่จะถูกส่งออกไปพร้อมๆ กับการดึงข้อมูลชุดถัดไปกลับมาโพสต์ก่อนหน้านี้ในซีรีส์นี้ได้แนะนำ Strands Robots ซึ่งเป็น SDK แบบโอเพนซอร์สจาก AWS (Apache 2.0) ที่เปิดเผยการทำงานของหุ่นยนต์ การจำลอง และสแต็ก LeRobot ในรูปแบบ AgentTools ที่คุณสามารถนำมาประกอบกันเป็น Strands agent เดียวกัน โพสต์นั้นได้กล่าวถึง Robot() factory, การบันทึกการสาธิตในการจำลอง, การรัน policy, และการนำโค้ด agent เดียวกันไปใช้งานจริงบนหุ่นยนต์ SO-101 โดย Robot() factory นี้จะค้นหาชื่อเทียบกับ registry ของแขน, หุ่นยนต์ฮิวแมนนอยด์, ฐานเคลื่อนที่ และมือ ทำให้ SO-100 ที่ใช้ในโพสต์นี้เป็นเพียงหนึ่งในรูปแบบที่รองรับหลายรูปแบบ แคตตาล็อกหุ่นยนต์จะแสดงรายการหุ่นยนต์ทั้งหมดที่ factory รู้จัก LeRobot ใช้รูปแบบชุดข้อมูลที่ถูกใช้แล้วมากกว่า 90,000 ชุดข้อมูลและโมเดลบน Hub จากผู้เผยแพร่กว่า 8,000 ราย (LeRobot Project Pulse) การบันทึกของ Strands Robots ก็เป็นหนึ่งในนั้นเช่นกัน ดังนั้น สิ่งใดก็ตามที่ถูกสร้างขึ้นมาเพื่ออ่านข้อมูล LeRobot จะสามารถอ่านข้อมูลนี้ได้โดยไม่ต้องแปลง หากคุณยังใหม่กับ Strands Robots ควรเริ่มต้นจากตรงนั้นก่อน โพสต์นี้จะถือว่าคุณได้ตั้งค่าพื้นฐานเหล่านั้นแล้วโพสต์นั้นได้ติดตาม agent loop ไปในทิศทางเดียว จากชุดข้อมูลบน Hub ไปยังหุ่นยนต์จริง โพสต์นี้จะติดตามข้อมูลในทิศทางตรงกันข้าม จากเฟรมแรกที่บันทึกกลับไปยัง policy ที่นำไปใช้งานจริง ผ่าน Hugging Face Storage Buckets ซึ่งเป็นที่เก็บข้อมูลแบบออบเจกต์ที่สามารถเปลี่ยนแปลงได้ ไม่มีการทำเวอร์ชัน และใช้ Xet เป็นแบ็กเอนด์ ซึ่งประกาศเมื่อเดือนมีนาคม 2026 บัคเก็ตจะอยู่เคียงข้างกับ repository ของชุดข้อมูลของคุณใน namespace hf:// เดียวกัน และใช้ hf CLI ที่คุณมีอยู่แล้ว ดังนั้น มันจะกลายเป็นชั้นการทำงานที่เก็บข้อมูลของคุณตั้งแต่ที่คุณบันทึกไปจนถึงวันที่คุณฝึกฝนใครสักคนต้องตัดสินใจว่าจะเก็บ episode ใดไว้ เมื่อฉากมีการเปลี่ยนแปลงมากพอที่จะต้องบันทึกใหม่ วันนี้มีข้อมูลเพียงพอที่จะฝึกฝนหรือไม่ และเช็คพอยต์ใดที่จะมาแทนที่ตัวที่อยู่บนแขน การตัดสินใจเหล่านี้เกิดขึ้นซ้ำๆ หลายสิบครั้งตลอดการเก็บข้อมูล และแต่ละครั้งต้องการการตรวจสอบสิ่งที่ได้รับกลับมาก่อนที่จะส่งคำสั่งถัดไป นั่นคืองานของ agent โพสต์นี้จะแนะนำคุณตลอด data loop ภายใน agent เดียวกัน: บันทึกการสาธิตลงใน Storage Bucket, จัดเก็บข้อมูลเพื่อให้การซิงค์แต่ละครั้งอัปโหลดเฉพาะไบต์ที่เปลี่ยนแปลง, ฝึกฝนโดยการสตรีมชุดข้อมูลโดยตรงจาก Hub แทนที่จะดาวน์โหลด, และนำเช็คพอยต์ไปใช้งานจริงบนฮาร์ดแวร์ด้วยการเปลี่ยนแปลง keyword argument เพียงเล็กน้อย ส่วนที่สามารถรันได้ของโพสต์นี้อยู่ที่ examples/notebooks/05streamingdata_loop.ipynbในขณะที่โพสต์แรกบันทึกชุดข้อมูลและส่งไปยัง Hub เอเจนต์ที่คุณสร้างขึ้นที่นี่จะบันทึก LeRobotDataset จากข้อความภาษาธรรมชาติ, ซิงค์เข้าไปใน Storage Bucket, และสตรีมชุดข้อมูลเดียวกันนั้นกลับมาทีละเฟรม, ถอดรหัสวิดีโอจากกล้องแบบเรียลไทม์ โดยไม่ต้องคัดลอกข้อมูลมาไว้ที่เครื่อง คุณอ่านมันกลับมาในกระบวนการเดียวกับที่เขียนมัน: Strands Robots Robot() เดียวกันที่บันทึกชุดข้อมูล ก็จะสตรีมข้อมูลนั้นออกมา เช็คพอยต์ที่ฝึกฝนแล้วจะถูกนำไปใช้งานจริงกับ Robot() ตัวเดียวกันด้วยการเปลี่ยนแปลง keyword argument เพียงเล็กน้อย และการสาธิตที่มันบันทึกบนฮาร์ดแวร์จะกลับไปยังบัคเก็ตเดิม![Figure 1: The four stages share one backend. Robot("so100") records a LeRobotDataset through the shared DatasetRecorder; syncdatasettobucket(...) syncs it into a Storage Bucket; streamdataset(...) reads it back over the Hub with no full download; and the trained checkpoint deploys to the same Robot with mode="real". The on-disk format stays exactly as LeRobot wrote it.](https://huggingface.co/blog/amazon/strands-lerobot-streaming-data-loop/raw/main/figure1.png)รูปที่ 1: สี่ขั้นตอนใช้แบ็กเอนด์เดียวกัน Robot("so100") บันทึก LeRobotDataset ผ่าน DatasetRecorder ที่ใช้ร่วมกัน; syncdatasettobucket(...) ซิงค์เข้าไปใน Storage Bucket; streamdataset(...) อ่านกลับมาผ่าน Hub โดยไม่ต้องดาวน์โหลดทั้งหมด; และเช็คพอยต์ที่ฝึกฝนแล้วจะถูกนำไปใช้งานจริงกับ Robot ตัวเดียวกันด้วยโหมด "real" รูปแบบบนดิสก์ยังคงเหมือนเดิมที่ LeRobot เขียนไว้เนื่องจาก Robot() ตัวเดียวทั้งบันทึกชุดข้อมูลและอ่านกลับมา การรวบรวมข้อมูลและการฝึกฝนจึงเป็นสองเมธอดบนออบเจกต์เดียวผ่านแบ็กเอนด์เดียว เอเจนต์จะตัดสินใจรัน episode และเรียกใช้ tool หนึ่งตัว จากนั้น rollout จะดำเนินต่อไปตามความถี่การควบคุมของหุ่นยนต์จนกว่า episode จะสิ้นสุด โดยมี trained policy เป็นผู้สร้างการกระทำทุกอย่าง วงจรทั้งหมดนี้ทำได้ในไม่กี่บรรทัด:สิ่งที่ตามมาคือสิ่งที่เกิดขึ้นจริงภายในวงจรนั้น ทีละขั้นตอนสิ่งที่ต้องเตรียมก่อนเริ่มPython 3.12+ บน Linux หรือ macOS (รองรับ Apple Silicon สำหรับ MuJoCo backend)ผู้ให้บริการโมเดลที่เข้ากันได้กับ Strands สำหรับการให้เหตุผลของเอเจนต์ เช่น Amazon Bedrock พร้อม AWS credentials, Anthropic API, OpenAI, หรือ Ollama ที่รันบนเครื่องStrands Robots พร้อมส่วนเสริม dataset: uv pip install -U "strands-robots[sim-mujoco,lerobot]>=0.5.1" ส่วนเสริม lerobot จะดึง LeRobot (>=0.6.1), datasets, av, และ torchcodec มาให้ ทำให้การบันทึกและถอดรหัสวิดีโอทำงานได้โดยไม่ต้องตั้งค่าเพิ่มเติม ดูคู่มือการติดตั้งทั้งหมดนี้สามารถรันบนแล็ปท็อปได้ สิ่งที่รันคือ loop ไม่ใช่ policy ที่ใช้งานได้จริง: โดยค่าเริ่มต้นจะใช้ mock policy ซึ่งจะบันทึกชุดข้อมูลที่ถูกต้องแต่ไม่เป็นประโยชน์บัญชี Hugging Face และโทเค็นที่มีสิทธิ์เขียน รวมถึง hf CLI สำหรับสร้างบัคเก็ตและซิงค์ชุดข้อมูล: `pip install -U "huggingface-hub>=1.6.0,https://huggingface.co/blog/amazon/strands-lerobot-streaming-data-loop
3 Σχόλια 0 Μοιράστηκε 883 Views 0 Προεπισκόπηση