
Giới thiệu dự án
Ultimate SFighterAI là một dự án học tăng cường sâu dành cho Street Fighter II: Special Champion Edition. Dự án sử dụng Ryu làm nhân vật người chơi, huấn luyện mô hình NatureCNN bằng thuật toán PPO và mở rộng phạm vi huấn luyện đến toàn bộ 12 màn chơi.
Đầu vào quyết định của mô hình hoàn toàn đến từ các pixel RGB của hình ảnh trò chơi, không trực tiếp đọc vị trí nhân vật, trạng thái hành động hay thanh máu. Môi trường huấn luyện chỉ sử dụng các biến bộ nhớ agent_hp và enemy_hp để tính phần thưởng và xác định thắng thua.
Dự án đã cung cấp trọng số mô hình đã huấn luyện và nhật ký huấn luyện. Vì vậy, bạn có thể xem AI thi đấu ngay, tái hiện thí nghiệm, điều chỉnh quy mô chạy song song hoặc tiếp tục huấn luyện dựa trên mô hình hiện có.
Tính năng chính và đặc điểm triển khai
- Hỗ trợ toàn bộ 12 màn: Mỗi màn có thể chạy trong một trình mô phỏng độc lập và cùng huấn luyện một mô hình NatureCNN.
- Ra quyết định thuần thị giác: Mô hình chọn di chuyển, tấn công và đòn đặc biệt dựa trên hình ảnh trò chơi đã xử lý.
- 27 hành động rời rạc: Bao gồm đứng yên, di chuyển, đòn đánh thường, đòn đánh khi ngồi, cùng các động tác Hadouken, Tatsumaki Senpukyaku và Shoryuken theo cả hai hướng.
- Học tăng cường PPO: Dự án sử dụng thuật toán PPO của Stable-Baselines3 để huấn luyện.
- Nhiều chế độ đánh giá: Hỗ trợ kiểm tra từng màn bằng tệp lưu, thắng hai trong ba ván, đánh giá KO một lần và liên tục vượt màn từ màn đầu tiên.
- Mô hình được huấn luyện sẵn: Trọng số mặc định nằm tại
logs/trained_models/ppo_ryu.zip. - Trực quan hóa quá trình huấn luyện: Có thể sử dụng TensorBoard để xem thay đổi phần thưởng và nhật ký cập nhật mô hình.
- Hỗ trợ nhiều thiết bị: Tham số huấn luyện và suy luận hỗ trợ
auto,cpu,cudavàmps.
Tiền xử lý hình ảnh
Hình ảnh trò chơi gốc được cắt giữa tâm, trích xuất tiền cảnh chuyển động và thu nhỏ, cuối cùng tạo thành đầu vào mô hình kích thước 84×84×3. Việc trích xuất tiền cảnh chuyển động sử dụng sai khác mức xám tại ba thời điểm t-16, t-8 và t, nhân độ sáng nền với 0.35, sau đó kết hợp ba kênh R, G, B. Cách xử lý này giúp mô hình nhận biết chuyển động và đòn tấn công của nhân vật.
Cơ chế phần thưởng
Phần thưởng chủ yếu được tính từ thay đổi thanh máu của hai bên, kết quả hạ gục và chi phí thời gian. Công thức tính phần thưởng sát thương là:
0.01 × (3 × máu đối thủ mất − máu bản thân mất)
Phần thưởng khi hạ gục đối thủ là:
0.01 × (176 + máu còn lại của bản thân)
Mức phạt khi bản thân bị hạ gục là:
0.01 × (176 + máu còn lại của đối thủ)
Ngoài ra, mỗi lần thực sự thực hiện hành động sẽ bị trừ một khoản phạt thời gian, mặc định là 0.0005.
Giải thích cấu trúc dự án
data/: Lưu tệp lưu trạng thái đầu màn của 12 màn, định nghĩa biến bộ nhớ trong trò chơi và cấu hình cảnh.main/train.py: Phụ trách huấn luyện song song toàn bộ màn và tiếp tục huấn luyện.main/test.py: Phụ trách kiểm tra từng màn và đánh giá vượt màn liên tục.main/env_utils.py: Xử lý cấu hình ROM và xây dựng môi trường.main/custom_wrappers.py: Triển khai xử lý hình ảnh, ánh xạ hành động và tính phần thưởng.logs/trained_models/ppo_ryu.zip: Mô hình đã huấn luyện do dự án cung cấp.logs/: Chứa nhật ký TensorBoard của quá trình huấn luyện.requirements.txt: Danh sách phụ thuộc Python.
Cài đặt và cấu hình môi trường
Bước 1: Chuẩn bị môi trường Python
Dự án khuyến nghị sử dụng Python 3.10. Môi trường được ghi nhận trong README để xác minh là macOS, Apple Silicon và Python 3.10.20, đồng thời đã xác minh đường dẫn CPU và Apple MPS. Với các nền tảng khác, hãy tham khảo hướng dẫn cài đặt chính thức của Stable-Retro và PyTorch.
Tạo và kích hoạt môi trường ảo trong thư mục gốc dự án, sau đó cài đặt các phụ thuộc:
python3.10 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
Người dùng Windows có thể sử dụng lệnh sau để kích hoạt môi trường ảo:
.venv\Scripts\activate
Bạn cũng có thể dùng Anaconda để tạo môi trường Python 3.10, sau đó cài đặt các phụ thuộc trong requirements.txt. Các phụ thuộc chính của dự án gồm Gymnasium, Stable-Retro và Stable-Baselines3.
Bước 2: Chuẩn bị ROM trò chơi
Stable-Retro không cung cấp ROM và dự án này cũng không bao gồm ROM. Hãy thu thập hợp pháp ROM được hỗ trợ của bản Mỹ của Street Fighter II: Special Champion Edition.
Sau khi có ROM, bạn có thể cung cấp đường dẫn tuyệt đối thông qua biến môi trường. Trên macOS hoặc Linux, thực thi:
export SF2_ROM_PATH="/absolute/path/to/your/rom.md"
Trên Windows PowerShell, sử dụng:
$env:SF2_ROM_PATH = "C:\path\to\your\rom.md"
Một cách khác là đặt ROM vào vị trí mặc định trong dự án:
data/street-fighter-ii-special-champion-edition-usa.md
Chương trình huấn luyện và kiểm tra sẽ tự động nhập ROM. Nếu Stable-Retro trong môi trường Python hiện tại đã nhập ROM này, bạn có thể chạy trực tiếp.
Bước 3: Xác nhận dữ liệu màn chơi
12 tệp .state trong thư mục data/ lần lượt lưu trạng thái đầu màn từ màn 1 đến màn 12. data.json và scenario_full_frame.json định nghĩa các biến bộ nhớ trong trò chơi và cấu hình cảnh. Chương trình sẽ đọc trực tiếp các tệp này, không cần sao chép chúng vào thư mục cài đặt của Stable-Retro.
Chạy mô hình đã huấn luyện sẵn
Kiểm tra lần lượt toàn bộ 12 màn
Sau khi hoàn tất cấu hình môi trường, thực thi trong thư mục gốc dự án:
python -m main.test --episodes 1
Chương trình sẽ lần lượt tải tệp lưu đầu màn từ màn 1 đến màn 12. Mỗi màn mặc định sử dụng thể thức thắng hai trong ba ván. --episodes 1 nghĩa là đánh giá đầy đủ một lượt; nếu bỏ qua tham số này, mặc định sẽ kiểm tra 10 lượt.
Sau khi thất bại ở một màn, chương trình vẫn tiếp tục kiểm tra các màn tiếp theo. Terminal sẽ hiển thị kết quả thắng thua, phần thưởng, tỷ lệ thắng theo màn và tỷ lệ thắng cả 12 màn trong một lượt đánh giá.
Tắt hình ảnh để tập trung vào kết quả đánh giá
Nếu không cần xem trận đấu, bạn có thể tắt kết xuất và chỉ định rõ việc suy luận bằng CPU:
python -m main.test --episodes 1 --no-render --device cpu
Tắt kết xuất phù hợp cho đánh giá hàng loạt và có thể giảm chi phí phát sinh do hiển thị.
Liên tục vượt màn từ màn đầu tiên
Để quan sát AI thách đấu đối thủ tiếp theo theo đúng quy trình của trò chơi, có thể chạy:
python -m main.test --episodes 1 --no-load-level-saves
Chế độ này chỉ tải tệp lưu của màn đầu tiên khi bắt đầu, sau đó để trò chơi tự chuyển sang các màn tiếp theo; ngay khi thất bại, lần thử hiện tại sẽ kết thúc. Chương trình sẽ xuất tỷ lệ thắng ở các màn đã thách đấu và tỷ lệ hoàn thành toàn bộ.
“Thắng toàn bộ” trong kiểm tra từng màn nghĩa là mô hình vượt qua đánh giá ở cả 12 tệp lưu màn độc lập; còn “tỷ lệ hoàn thành toàn bộ” yêu cầu mô hình vượt qua cả 12 màn trong một quy trình liên tục. Hai khái niệm này khác nhau.
Tham số kiểm tra thường dùng
--model-path PATH: Chỉ định mô hình PPO, mặc định làlogs/trained_models/ppo_ryu.zip.--episodes N: Đặt số lượt đánh giá từng màn hoặc số lần thử vượt màn liên tục, mặc định là10.--no-render: Tắt hình ảnh trò chơi.--no-load-level-saves: Không tải tệp lưu theo từng màn, thay vào đó liên tục thách đấu từ màn đầu tiên.--reset-round: Trong kiểm tra từng màn, sử dụng một lần KO làm đơn vị đánh giá thay vì thể thức mặc định thắng hai trong ba ván.--device auto/cpu/cuda/mps: Chọn thiết bị suy luận của mô hình, mặc định làauto.--speed N: Tăng tốc trực quan hóa bằng cách giảm số khung hình hiển thị, mặc định là4.
Huấn luyện mô hình của riêng bạn
Bắt đầu với cấu hình quy mô nhỏ
Cấu hình huấn luyện mặc định yêu cầu rất nhiều tài nguyên. Khi chạy lần đầu, nên chỉ khởi động một trình mô phỏng cho mỗi màn và sử dụng batch nhỏ:
python -m main.train --envs-per-level 1 --batch-size 256 --log-dir runs/ryu
Vì dự án có 12 màn, --envs-per-level 1 nghĩa là tổng cộng chạy 12 trình mô phỏng song song. Trước tiên hãy xác nhận ROM, việc xây dựng môi trường, thiết bị và đầu ra nhật ký đều hoạt động bình thường, sau đó tăng dần số lượng chạy song song.
Tìm hiểu quy mô huấn luyện mặc định
Khi chạy trực tiếp python -m main.train, mỗi màn mặc định khởi động 64 trình mô phỏng, tổng cộng 768 môi trường chạy song song. Kết hợp với n-steps=128 mặc định, mỗi lần cập nhật PPO sẽ thu thập 98,304 mẫu, còn mục tiêu huấn luyện đầy đủ là 700 triệu bước.
Cấu hình mặc định cần CPU và bộ nhớ dồi dào, không phù hợp để kiểm tra lần đầu trên máy tính thông thường. Hãy giảm
--envs-per-level,--batch-sizehoặc tổng số bước huấn luyện tùy theo phần cứng thực tế.
Tham số huấn luyện thường dùng
--envs-per-level N: số lượng môi trường chạy song song cho mỗi màn; mặc định là 64 môi trường mỗi màn nếu không chỉ định.--total-timesteps N: tổng số bước của lần huấn luyện này; khi tiếp tục huấn luyện, đây là số bước bổ sung, mặc định là700000000.--n-steps N: số bước mà mỗi trình mô phỏng thu thập trước một lần cập nhật, mặc định là128.--batch-size N: kích thước batch cập nhật PPO, mặc định là8192.--n-epochs N: số vòng huấn luyện trên mỗi batch dữ liệu mẫu, mặc định là3.--learning-rate N: tốc độ học, mặc định là0.0002.--device auto/cpu/cuda/mps: chọn thiết bị huấn luyện, mặc định làmps.--log-dir PATH: thư mục xuất mô hình và đường cong huấn luyện, mặc định làlogs/ALL_MOTION_SIMULTANEOUS.
Tiếp tục huấn luyện từ trọng số đã được huấn luyện trước
Dự án hỗ trợ tiếp tục huấn luyện từ trọng số PPO được cung cấp. Lệnh dưới đây huấn luyện bổ sung 1 triệu bước và ghi kết quả vào thư mục mới:
python -m main.train \
--resume-model logs/trained_models/ppo_ryu.zip \
--envs-per-level 1 --batch-size 256 \
--total-timesteps 1000000 --log-dir runs/ryu-resume
Khi tiếp tục huấn luyện, --total-timesteps biểu thị số bước huấn luyện bổ sung trong lần này, không phải mục tiêu tích lũy bao gồm số bước đã huấn luyện của mô hình cũ.
Xem đường cong huấn luyện bằng TensorBoard
Dự án tích hợp sẵn tính năng ghi nhật ký huấn luyện. Khởi động TensorBoard:
tensorboard --logdir=logs
Sau đó mở http://localhost:6006/ trong trình duyệt để xem diễn biến phần thưởng và các đường cong liên quan đến việc cập nhật mô hình.
Nếu muốn xem nhật ký do bạn tự huấn luyện tạo ra, chỉ cần thay đổi thư mục:
tensorboard --logdir=runs/ryu
Đề xuất sử dụng nâng cao
- Xác minh trước khi mở rộng: trước tiên hãy huấn luyện trong thời gian ngắn với một môi trường cho mỗi màn, xác nhận việc nhập ROM, đọc tệp lưu và ghi nhật ký đều hoạt động chính xác, sau đó mới tăng số lượng trình mô phỏng chạy song song.
- Chọn thiết bị theo nền tảng: Apple Silicon có thể thử
mps, môi trường tương thích với GPU NVIDIA có thể chọncuda, nếu không thì sử dụngcpuhoặcauto. README được kiểm chứng trên môi trường macOS Apple Silicon; các nền tảng khác cần cấu hình theo yêu cầu của PyTorch và Stable-Retro. - Phân biệt hai loại đánh giá: kiểm thử tệp lưu theo từng màn phù hợp để phân tích hiệu suất trước từng đối thủ, còn vượt ải liên tục gần với quy trình chơi hoàn chỉnh hơn. Khi báo cáo kết quả, cần nêu rõ chế độ đã sử dụng.
- Đánh giá hàng loạt không kết xuất: khi thực hiện thống kê qua nhiều lượt, hãy thêm
--no-render; chỉ bật hiển thị khi quan sát hiệu suất của chiến lược. - Lưu thí nghiệm trong các thư mục riêng: sử dụng
--log-dirđể tạo thư mục cho từng tổ hợp tham số, tránh ghi đè nhật ký huấn luyện và thuận tiện so sánh trong TensorBoard. - Xem đầy đủ các tùy chọn lệnh: cả tập lệnh huấn luyện và kiểm thử đều cung cấp thông tin trợ giúp.
python -m main.train --help
python -m main.test --help
Ngoài cách chạy dưới dạng mô-đun, dự án cũng hỗ trợ thực thi trực tiếp tập lệnh:
python main/train.py
python main/test.py
Lời kết
Ultimate SFighterAI cho thấy cách kết hợp đầu vào pixel, ánh xạ hành động, định hình phần thưởng, PPO và môi trường chạy song song nhiều màn để xây dựng một tác tử AI hoàn chỉnh cho trò chơi đối kháng. Lộ trình bắt đầu ổn định nhất là cấu hình ROM và chạy mô hình đã được huấn luyện trước, sau đó tái hiện quá trình huấn luyện với mức độ song song thấp, cuối cùng từng bước mở rộng quy mô thí nghiệm thông qua huấn luyện tiếp, lựa chọn thiết bị và phân tích bằng TensorBoard.
Dự án được phát hành theo Apache License 2.0 và sử dụng các thành phần mã nguồn mở như Gymnasium, Stable-Retro và Stable-Baselines3.
