264 lines
9.3 KiB
Plaintext
264 lines
9.3 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import pickle\n",
|
||
"import pycuda.driver as cuda\n",
|
||
"import sys\n",
|
||
"import os\n",
|
||
"from datetime import datetime\n",
|
||
"from stable_baselines3 import PPO\n",
|
||
"\n",
|
||
"current_dir = os.path.dirname(os.path.abspath(\"__file__\"))\n",
|
||
"parent_dir = os.path.abspath(os.path.join(current_dir, os.pardir))\n",
|
||
"output_dir = os.path.join(parent_dir, \"output\")\n",
|
||
"os.makedirs(output_dir, exist_ok=True)\n",
|
||
"sys.path.append(parent_dir)\n",
|
||
"\n",
|
||
"cuda.init()\n",
|
||
"context2 = cuda.Device(2).make_context()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"with open(os.path.join(output_dir, \"d1a3o12_re100.pkl\"), 'rb') as f:\n",
|
||
" data = pickle.load(f)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from gym_env import CustomEnv\n",
|
||
"context2.push()\n",
|
||
"vec_env = CustomEnv(device_id=2)\n",
|
||
"context2.pop()\n",
|
||
"model = PPO.load(os.path.join(parent_dir, \"models\", \"d1a3o12_re100.zip\"), env=vec_env, device=\"cuda:2\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"context2.push()\n",
|
||
"model_env = model.get_env()\n",
|
||
"# obs = model_env.reset()\n",
|
||
"obs_init = np.array(model_env.envs[0].save_states.copy())\n",
|
||
"context2.pop()\n",
|
||
"\n",
|
||
"obs_init[:, 6:12] = obs_init[:, 6:12]/model_env.envs[0].force_norm_fact.copy()\n",
|
||
"sens_deviation = model_env.envs[0].sens_deviation.copy()\n",
|
||
"sens_norm_fact = model_env.envs[0].sens_norm_fact.copy()\n",
|
||
"for i in range(6):\n",
|
||
" obs_init[:, i] = (obs_init[:, i] - sens_deviation[i]) / sens_norm_fact[i]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from darts import TimeSeries\n",
|
||
"from darts.models import RNNModel # 或者 NBEATSModel、TFTModel 等\n",
|
||
"from darts.models import TFTModel\n",
|
||
"from darts.dataprocessing.transformers import Scaler\n",
|
||
"from typing import List"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"set_obs_train = []\n",
|
||
"set_act_train = []\n",
|
||
"index = pd.RangeIndex(start=0, stop=480, step=1)\n",
|
||
"for i in range(len(data)):\n",
|
||
" obs_episolde = np.array(data[i]['observations'])[:, 0]\n",
|
||
" if np.any(np.all(obs_episolde == 0, axis=1)):\n",
|
||
" # print(f\"Episode {i} contains a row with all zeros in observations.\")\n",
|
||
" continue\n",
|
||
" else:\n",
|
||
" obs_full = np.concatenate((obs_init, obs_episolde), axis=0)\n",
|
||
" act_init = np.zeros((len(obs_init), 3))\n",
|
||
" act_episolde = np.array(data[i]['actions'])\n",
|
||
" act_full = np.concatenate((act_init, act_episolde), axis=0)\n",
|
||
"\n",
|
||
" obs_ts = TimeSeries.from_times_and_values(\n",
|
||
" times=index,\n",
|
||
" values=obs_full.astype(np.float32), \n",
|
||
" columns=[f\"obs{dim+1}\" for dim in range(12)]\n",
|
||
" )\n",
|
||
" act_ts = TimeSeries.from_times_and_values(\n",
|
||
" times=index,\n",
|
||
" values=act_full.astype(np.float32), \n",
|
||
" columns=[f\"act{dim+1}\" for dim in range(3)]\n",
|
||
" )\n",
|
||
"\n",
|
||
" set_obs_train.append(obs_ts)\n",
|
||
" set_act_train.append(act_ts)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Trainer will use only 1 of 4 GPUs because it is running inside an interactive / notebook environment. You may try to set `Trainer(devices=4)` but please note that multi-GPU inside interactive / notebook environments is considered experimental and unstable. Your mileage may vary.\n",
|
||
"GPU available: True (cuda), used: True\n",
|
||
"TPU available: False, using: 0 TPU cores\n",
|
||
"HPU available: False, using: 0 HPUs\n",
|
||
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1,2,3]\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n",
|
||
" | Name | Type | Params | Mode \n",
|
||
"------------------------------------------------------------------------------------------------\n",
|
||
"0 | train_metrics | MetricCollection | 0 | train\n",
|
||
"1 | val_metrics | MetricCollection | 0 | train\n",
|
||
"2 | input_embeddings | _MultiEmbedding | 0 | train\n",
|
||
"3 | static_covariates_vsn | _VariableSelectionNetwork | 0 | train\n",
|
||
"4 | encoder_vsn | _VariableSelectionNetwork | 17.8 K | train\n",
|
||
"5 | decoder_vsn | _VariableSelectionNetwork | 896 | train\n",
|
||
"6 | static_context_grn | _GatedResidualNetwork | 4.3 K | train\n",
|
||
"7 | static_context_hidden_encoder_grn | _GatedResidualNetwork | 4.3 K | train\n",
|
||
"8 | static_context_cell_encoder_grn | _GatedResidualNetwork | 4.3 K | train\n",
|
||
"9 | static_context_enrichment | _GatedResidualNetwork | 4.3 K | train\n",
|
||
"10 | lstm_encoder | LSTM | 8.4 K | train\n",
|
||
"11 | lstm_decoder | LSTM | 8.4 K | train\n",
|
||
"12 | post_lstm_gan | _GateAddNorm | 2.2 K | train\n",
|
||
"13 | static_enrichment_grn | _GatedResidualNetwork | 5.3 K | train\n",
|
||
"14 | multihead_attn | _InterpretableMultiHeadAttention | 2.6 K | train\n",
|
||
"15 | post_attn_gan | _GateAddNorm | 2.2 K | train\n",
|
||
"16 | feed_forward_block | _GatedResidualNetwork | 4.3 K | train\n",
|
||
"17 | pre_output_gan | _GateAddNorm | 2.2 K | train\n",
|
||
"18 | output_layer | Linear | 6.7 K | train\n",
|
||
"------------------------------------------------------------------------------------------------\n",
|
||
"78.2 K Trainable params\n",
|
||
"0 Non-trainable params\n",
|
||
"78.2 K Total params\n",
|
||
"0.313 Total estimated model params size (MB)\n",
|
||
"382 Modules in train mode\n",
|
||
"0 Modules in eval mode\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch 49: 100%|██████████| 12/12 [00:00<00:00, 21.99it/s, train_loss=0.133]"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"`Trainer.fit` stopped: `max_epochs=50` reached.\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch 49: 100%|██████████| 12/12 [00:00<00:00, 21.93it/s, train_loss=0.133]\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"TFTModel(output_chunk_shift=0, hidden_size=32, lstm_layers=1, num_attention_heads=4, full_attention=False, feed_forward=GatedResidualNetwork, dropout=0.1, hidden_continuous_size=8, categorical_embedding_sizes=None, add_relative_index=True, loss_fn=None, likelihood=None, norm_type=LayerNorm, use_static_covariates=True, input_chunk_length=120, output_chunk_length=1, batch_size=32, n_epochs=50, random_state=42)"
|
||
]
|
||
},
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"model_tft = TFTModel(\n",
|
||
" input_chunk_length=120,\n",
|
||
" output_chunk_length=1, # 预测1步\n",
|
||
" hidden_size=32,\n",
|
||
" lstm_layers=1,\n",
|
||
" dropout=0.1,\n",
|
||
" batch_size=32,\n",
|
||
" n_epochs=50,\n",
|
||
" add_relative_index=True,\n",
|
||
" random_state=42,\n",
|
||
" # 注意:TFT支持past_covariates与future_covariates,也可设置transformer头等更多超参\n",
|
||
")\n",
|
||
"\n",
|
||
"model_tft.fit(\n",
|
||
" series=obs_ts,\n",
|
||
" past_covariates=act_ts\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"for i in range(360):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"plot_data = obs_full[:, 11]\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"plt.plot(plot_data)"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "pycuda_3_10",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.10.13"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|