强化学习:人形机器人 —— soft-q-leanring的官方实现的配置环境

项目源码地址:

https://github.com/rail-berkeley/softlearning

image


调试这个代码其实没有什么实际意义,这里只是做了个尝试,纯属“恶趣味”。


安装时候的一个重点就是需要安装gcc-9,不能安装过高版本的GCC,否则报错。

mujoco版本为200,地址:

https://www.roboti.us/download.html

image


conda 安装TensorFlow:

conda install tensorflow-gpu==2.4.1


python版本 3.8


具体配置环境如下:


(softlearning) root@I1e4c53bdf900b01340:~/softlearning# pip list
Package Version Location


absl-py 2.1.0
aiohappyeyeballs 2.4.0
aiohttp 3.10.5
aiohttp-cors 0.7.0
aioredis 1.3.1
aiosignal 1.2.0
appnope 0.1.2
astor 0.8.1
astunparse 1.6.3
async-timeout 4.0.3
attrs 24.2.0
backcall 0.2.0
blessings 1.7
blinker 1.6.2
Brotli 1.0.9
brotlipy 0.7.0
cachetools 5.3.3
certifi 2024.8.30
cffi 1.17.1
chardet 3.0.4
charset-normalizer 3.3.2
click 8.1.7
cloudpickle 1.6.0
colorama 0.4.4
colorful 0.5.4
cryptography 43.0.0
cycler 0.10.0
Cython 0.29.21
decorator 4.4.2
dm-control 0.0.322773188
dm-env 1.3
dm-tree 0.1.5
fasteners 0.16
filelock 3.0.12
flatbuffers 24.3.25
frozenlist 1.4.0
future 0.18.2
gast 0.4.0
gitdb 4.0.5
GitPython 3.1.2
glfw 2.0.0
google-api-core 1.25.0
google-auth 2.29.0
google-auth-oauthlib 0.5.2
google-pasta 0.2.0
googleapis-common-protos 1.52.0
gpustat 0.6.0
grpcio 1.62.2
gtimer 1.0.0b5
gym 0.18.0
h5py 2.10.0
hiredis 1.1.0
idna 3.7
imageio 2.9.0
importlib-metadata 7.0.1
iniconfig 1.1.1
ipdb 0.13.4
ipython 7.19.0
ipython-genutils 0.2.0
jedi 0.18.0
joblib 1.0.0
jsonschema 3.2.0
Keras-Preprocessing 1.1.2
kiwisolver 1.3.1
labmaze 1.0.3
lxml 4.6.2
Markdown 3.4.1
MarkupSafe 2.1.3
matplotlib 3.3.3
mkl-fft 1.3.8
mkl-random 1.2.4
mkl-service 2.4.0
msgpack 1.0.2
mujoco-py 2.0.2.8
multidict 6.0.4
networkx 2.5
numpy 1.23.5
nvidia-ml-py3 7.352.0
oauthlib 3.2.2
opencensus 0.7.12
opencensus-context 0.1.2
opt-einsum 3.3.0
packaging 24.1
pandas 1.2.0
parso 0.8.1
pexpect 4.8.0
pickleshare 0.7.5
Pillow 7.2.0
pip 20.3.3
platformdirs 3.10.0
pluggy 0.13.1
pooch 1.7.0
prometheus-client 0.9.0
prompt-toolkit 3.0.10
protobuf 4.25.3
psutil 5.8.0
ptyprocess 0.7.0
py 1.10.0
py-spy 0.3.4
pyasn1 0.4.8
pyasn1-modules 0.2.8
pycosat 0.6.3
pycparser 2.21
pyglet 1.5.0
Pygments 2.7.4
PyJWT 2.8.0
PyOpenGL 3.1.5
PyOpenGL-accelerate 3.1.5
pyOpenSSL 24.2.1
pyparsing 2.4.7
pyrsistent 0.17.3
PySocks 1.7.1
pytest 6.2.1
python-dateutil 2.8.1
pytz 2020.5
PyWavelets 1.1.1
PyYAML 5.4
ray 1.2.0
redis 3.5.3
requests 2.32.3
requests-oauthlib 2.0.0
rsa 4.7.2
ruamel.yaml 0.15.87
scikit-image 0.18.1
scikit-learn 0.24.1
scikit-video 1.1.11
scipy 1.10.1
setproctitle 1.2.1
setuptools 65.5.0
six 1.16.0
smmap 3.0.4
softlearning 0.0.1 /root/softlearning
tabulate 0.8.7
tensorboard 2.12.1
tensorboard-data-server 0.7.0
tensorboard-plugin-wit 1.8.1
tensorboardX 2.1
tensorflow 2.4.1
tensorflow-addons 0.12.1
tensorflow-estimator 2.6.0
tensorflow-probability 0.12.1
termcolor 2.1.0
threadpoolctl 2.1.0
tifffile 2021.1.14
toml 0.10.2
tqdm 4.55.1
traitlets 5.0.5
typeguard 2.10.0
typing-extensions 3.7.4.3
urllib3 2.2.3
wcwidth 0.2.5
werkzeug 3.0.3
wheel 0.36.2
wrapt 1.14.1
yarl 1.11.0
zipp 3.20.2



运行效果:


(softlearning) root@I1e4c53bdf900b01340:~/softlearning# softlearning run_example_local examples.development --algorithm SAC --universe gym --domain HalfCheetah --task v3 --exp-name my-sac-experiment-1 --checkpoint-frequency 1000 # Save the checkpoint to resume training later
2024-12-16 12:50:33.877775: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.1
INFO:absl:MUJOCO_GL is not set, so an OpenGL backend will be chosen automatically.
/usr/local/miniconda3/envs/softlearning/lib/python3.8/site-packages/glfw/init.py:834: GLFWError: (65544) b'X11: The DISPLAY environment variable is missing'
warnings.warn(message, GLFWError)
INFO:absl:Successfully imported OpenGL backend: glfw
INFO:absl:MuJoCo library version is: 200
Warning: robosuite package not found. Run pip install robosuite to use robosuite environments.
2024-12-16 12:50:39,669 WARNING tune.py:411 -- Tune detects GPUs, but no trials are using GPUs. To enable trials to use GPUs, set tune.run(resources_per_trial={'gpu': 1}...) which allows Tune to expose 1 GPU to each trial. You can also override Trainable.default_resource_request if using the Trainable API.
== Status ==
Memory usage on this node: 5.7/31.2 GiB
Using FIFO scheduling algorithm.
Resources requested: 32/32 CPUs, 0/1 GPUs, 0.0/15.23 GiB heap, 0.0/5.22 GiB objects (0/1.0 accelerator_type:G)
Result logdir: /root/ray_results/gym/HalfCheetah/v3/2024-12-16T12-50-37-my-sac-experiment-1
Number of trials: 1/1 (1 RUNNING)
+--------------------------+----------+-------+----------------------------------------------+--------------------------------------------------------------------------+-----------------------------------------------------+--------------------------------------+-------------------+
| Trial name | status | loc | algorithm_params/config/num_warmup_samples | environment_params/evaluation | exploration_policy_params/config/observation_keys | replay_pool_params/config/max_size | run_params/seed |
|--------------------------+----------+-------+----------------------------------------------+--------------------------------------------------------------------------+-----------------------------------------------------+--------------------------------------+-------------------|
| id=4c382_00000-seed=6740 | RUNNING | | 10000 | {'domain': 'HalfCheetah', 'task': 'v3', 'universe': 'gym', 'kwargs': {}} | | 1000000 | 6740 |
+--------------------------+----------+-------+----------------------------------------------+--------------------------------------------------------------------------+-----------------------------------------------------+--------------------------------------+-------------------+

(pid=5509) 2024-12-16 12:50:39.798729: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.1
(pid=5509) /usr/local/miniconda3/envs/softlearning/lib/python3.8/site-packages/glfw/init.py:834: GLFWError: (65544) b'X11: The DISPLAY environment variable is missing'
(pid=5509) warnings.warn(message, GLFWError)
(pid=5509) Warning: robosuite package not found. Run pip install robosuite to use robosuite environments.
(pid=5509) 2024-12-16 12:50:43.580032: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
(pid=5509) 2024-12-16 12:50:43.581043: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcuda.so.1
(pid=5509) Using seed 6740
(pid=5509) 2024-12-16 12:50:43.586568: E tensorflow/stream_executor/cuda/cuda_driver.cc:328] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
(pid=5509) 2024-12-16 12:50:43.586611: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: I1e4c53bdf900b01340
(pid=5509) 2024-12-16 12:50:43.586626: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: I1e4c53bdf900b01340
(pid=5509) 2024-12-16 12:50:43.586737: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:200] libcuda reported version is: 535.104.5
(pid=5509) 2024-12-16 12:50:43.586772: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 535.104.5
(pid=5509) 2024-12-16 12:50:43.586785: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:310] kernel version seems to match DSO: 535.104.5
(pid=5509) 2024-12-16 12:50:43.626584: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: SSE4.1 SSE4.2 AVX AVX2 FMA
(pid=5509) To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
(pid=5509) 2024-12-16 12:50:43.628421: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
(pid=5509) 2024-12-16 12:50:44.198167: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
(pid=5509) 2024-12-16 12:50:44.199988: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 2494285000 Hz
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method UniformPolicyMixin.actions of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f9a1580>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method UniformPolicyMixin.actions of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f9a1580>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method GaussianPolicy.actions of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f94c880>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method GaussianPolicy.actions of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f94c880>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method SAC._update_critic of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f5e44f0>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method SAC._update_critic of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f5e44f0>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method SAC._compute_Q_targets of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f5c7c40>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method SAC._compute_Q_targets of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f5c7c40>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method GaussianPolicy.actions_and_log_probs of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f50e580>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method GaussianPolicy.actions_and_log_probs of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f50e580>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method SAC._update_actor of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f890640>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method SAC._update_actor of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f890640>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method SAC._update_alpha of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f8f56a0>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
(pid=5509) WARNING:tensorflow:AutoGraph could not transform <bound method SAC._update_alpha of <tensorflow.python.eager.function.TfMethodTarget object at 0x7fdb6f8f56a0>> and will run it as-is.
(pid=5509) Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, export AUTOGRAPH_VERBOSITY=10) and attach the full output.
(pid=5509) Cause: module 'gast' has no attribute 'Index'
(pid=5509) To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
Result for id=4c382_00000-seed=6740:
alpha: 0.013419248163700104
date: 2024-12-16_12-57-54
done: false
epoch: 0
evaluation:
environment_infos:
reward_ctrl-first-mean: -0.16179109811782838
reward_ctrl-last-mean: -0.35917644500732426
reward_ctrl-mean-mean: -0.43524877082109453
reward_ctrl-median-mean: -0.4390748977661133
reward_ctrl-range-mean: 0.436385715007782
reward_run-first-mean: -0.23370339893203743
reward_run-last-mean: 3.397741379326362
reward_run-mean-mean: 3.004825301372694
reward_run-median-mean: 3.0720580300786082
reward_run-range-mean: 6.581387628249331
x_position-first-mean: 0.030390028207056195
x_position-last-mean: 150.28334026678837
x_position-mean-mean: 74.08733754694549
x_position-median-mean: 75.4983970130458
x_position-range-mean: 150.2902721967369
x_velocity-first-mean: -0.23370339893203743
x_velocity-last-mean: 3.397741379326362
x_velocity-mean-mean: 3.004825301372694
x_velocity-median-mean: 3.0720580300786082
x_velocity-range-mean: 6.581387628249331
episode-length-max: 1000
episode-length-mean: 1000.0
episode-length-min: 1000
episode-length-std: 0.0
episode-reward-max: 2569.57666015625
episode-reward-mean: 2569.57666015625
episode-reward-min: 2569.57666015625
episode-reward-std: 0.0
experiment_id: 1d37cf8a753b4af58cc8dcda80af0bd7
hostname: I1e4c53bdf900b01340
iterations_since_restore: 1
node_ip: 172.17.0.2
num_train_steps: 25000
pid: 5509
policy:
actions-max: 0.9999394416809082
actions-mean: -0.06343454867601395
actions-min: -0.9999583959579468
actions-std: 0.7254316210746765
entropy-mean: -5.708264350891113
entropy-std: 4.681765079498291
scales-max: 0.9172292947769165
scales-mean: 0.3862115442752838
scales-min: 0.08527152985334396
scales-std: 0.1276833862066269
shifts-max: 5.195384502410889
shifts-mean: -0.11544707417488098
shifts-min: -4.8597187995910645
shifts-std: 1.4245387315750122
sampler:
episodes: 35
last-path-return: 1939.4584440457354
max-path-return: 1939.4584440457354
pool-size: 35000
total-samples: 35000
time_since_restore: 430.6497223377228
time_this_iter_s: 430.6497223377228
time_total_s: 430.6497223377228
times:
epoch_after_hook: 4.3585896492004395e-06
epoch_before_hook: 5.666911602020264e-05
evaluation_metrics: 0.0015571825206279755
evaluation_paths: 1.2899422124028206
sample: 43.41803643107414
timestep_after_hook: 0.08438490703701973
timestep_before_hook: 0.27303623780608177
train: 372.7208950482309
training_metrics: 0.005900684744119644
training_paths: 0.2025417499244213
timestamp: 1734325074
timestep: 25000
timesteps_since_restore: 0
total_timestep: 25000
training:
environment_infos:
reward_ctrl-first-mean: -0.13193519055843356
reward_ctrl-last-mean: -0.3118104374408722
reward_ctrl-mean-mean: -0.33342703488573433
reward_ctrl-median-mean: -0.33445447802543643
reward_ctrl-range-mean: 0.5215700647234917
reward_run-first-mean: 0.2100971005249112
reward_run-last-mean: 1.322908488446025
reward_run-mean-mean: 1.031672886361282
reward_run-median-mean: 0.9526681841697947
reward_run-range-mean: 6.064491192812454
x_position-first-mean: -0.005272056326933859
x_position-last-mean: 51.56786740671093
x_position-mean-mean: 29.668999877827662
x_position-median-mean: 32.66462589038448
x_position-range-mean: 51.62437024259738
x_velocity-first-mean: 0.2100971005249112
x_velocity-last-mean: 1.322908488446025
x_velocity-mean-mean: 1.031672886361282
x_velocity-median-mean: 0.9526681841697947
x_velocity-range-mean: 6.064491192812454
episode-length-max: 1000
episode-length-mean: 1000.0
episode-length-min: 1000
episode-length-std: 0.0
episode-reward-max: 1939.4584440457338
episode-reward-mean: 698.245851475548
episode-reward-min: 76.8735897872788
episode-reward-std: 536.5445856433406
training_iteration: 1
trial_id: 4c382_00000
update:
Q_loss-mean: 0.8220513463020325
Q_value-mean: 29.802295684814453
alpha: 0.16683357954025269
alpha_loss-mean: 1.5020512342453003
policy_loss-mean: -30.934799194335938

== Status ==
Memory usage on this node: 6.1/31.2 GiB
Using FIFO scheduling algorithm.
Resources requested: 32/32 CPUs, 0/1 GPUs, 0.0/15.23 GiB heap, 0.0/5.22 GiB objects (0/1.0 accelerator_type:G)
Result logdir: /root/ray_results/gym/HalfCheetah/v3/2024-12-16T12-50-37-my-sac-experiment-1
Number of trials: 1/1 (1 RUNNING)
+--------------------------+----------+-----------------+----------------------------------------------+--------------------------------------------------------------------------+-----------------------------------------------------+--------------------------------------+-------------------+--------+------------------+---------+------------+------------------+
| Trial name | status | loc | algorithm_params/config/num_warmup_samples | environment_params/evaluation | exploration_policy_params/config/observation_keys | replay_pool_params/config/max_size | run_params/seed | iter | total time (s) | epoch | timestep | total_timestep |
|--------------------------+----------+-----------------+----------------------------------------------+--------------------------------------------------------------------------+-----------------------------------------------------+--------------------------------------+-------------------+--------+------------------+---------+------------+------------------|
| id=4c382_00000-seed=6740 | RUNNING | 172.17.0.2:5509 | 10000 | {'domain': 'HalfCheetah', 'task': 'v3', 'universe': 'gym', 'kwargs': {}} | | 1000000 | 6740 | 1 | 430.65 | 0 | 25000 | 25000 |
+--------------------------+----------+-----------------+----------------------------------------------+--------------------------------------------------------------------------+-----------------------------------------------------+--------------------------------------+-------------------+--------+------------------+---------+------------+------------------+



相关:

python安装报错:'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers



posted on 2024-12-16 13:02  Angry_Panda  阅读(8)  评论(0编辑  收藏  举报

导航