mlsys-lab-sogang / Social-Rec-Sys

Social recommendation using GNN
0 stars 0 forks source link

[Transformer_modified] attention masking & main memory OOM #4

Closed skdbsxir closed 11 months ago

skdbsxir commented 11 months ago

1. Masking

def generate_attn_subsequent_mask(seq): """ Generate decoder's mask """ attn_shape = [seq.size(0), seq.size(1), seq.size(1)] subsequent_mask = np.triu(np.ones(attn_shape), k=1) subsequent_mask = torch.from_numpy(subsequent_mask).byte()

return subsequent_mask

<details>
<summary>하지만 위 masking을 적용하고 train을 하는 경우, loss와 RMSE, MAE 수치 값이 너무 이상함.</summary>
<div markdown="1">

best model saved: step = 399 epoch = 0 dev RMSE = 9862.3994140625 dev MAE = 9727.30859375

[Validation Results] Global Steps: 399 Epoch: 0 Valid Loss: 100062520.00000 Valid RMSE: 9862.39941 Valid MAE: 9727.30859 time stamp: 20.265928745269775

[Validation Results] Global Steps: 799 Epoch: 0 Valid Loss: 100062544.00000 Valid RMSE: 9862.53613 Valid MAE: 9727.50098 time stamp: 39.78810000419617

Epoch 0 Finished (Average Loss: 100063112.0000)

[Validation Results] Global Steps: 399 Epoch: 1 Valid Loss: 100062528.00000 Valid RMSE: 9862.92578 Valid MAE: 9728.29199 time stamp: 62.101946115493774

best model saved: step = 799 epoch = 1 dev RMSE = 9862.3408203125 dev MAE = 9727.2392578125

[Validation Results] Global Steps: 799 Epoch: 1 Valid Loss: 100062512.00000 Valid RMSE: 9862.34082 Valid MAE: 9727.23926 time stamp: 82.99191665649414

Epoch 1 Finished (Average Loss: 100062744.0000) best model saved: step = 399 epoch = 2 dev RMSE = 9862.1259765625 dev MAE = 9726.84375

[Validation Results] Global Steps: 399 Epoch: 2 Valid Loss: 100062552.00000 Valid RMSE: 9862.12598 Valid MAE: 9726.84375 time stamp: 105.23369526863098

[Validation Results] Global Steps: 799 Epoch: 2 Valid Loss: 100062528.00000 Valid RMSE: 9862.57031 Valid MAE: 9727.60156 time stamp: 125.98348832130432

Epoch 2 Finished (Average Loss: 100060856.0000)

[Validation Results] Global Steps: 399 Epoch: 3 Valid Loss: 100062528.00000 Valid RMSE: 9862.23828 Valid MAE: 9727.10840 time stamp: 148.43129086494446

[Validation Results] Global Steps: 799 Epoch: 3 Valid Loss: 100062544.00000 Valid RMSE: 9862.40625 Valid MAE: 9727.20801 time stamp: 169.21785831451416

Epoch 3 Finished (Average Loss: 100062816.0000)


</div>
</details>

<details>
<summary>decoder측의 masking을 제거하는 경우엔 비교적 비 정상적인 수치가 나오지 않음.</summary>
<div markdown="1">

best model saved: step = 399 epoch = 0 dev RMSE = 3.044887065887451 dev MAE = 2.874655246734619

[Validation Results] Global Steps: 399 Epoch: 0 Valid Loss: 1.85053 Valid RMSE: 3.04489 Valid MAE: 2.87466 time stamp: 13.912893056869507

best model saved: step = 799 epoch = 0 dev RMSE = 1.6691110134124756 dev MAE = 1.5905847549438477

[Validation Results] Global Steps: 799 Epoch: 0 Valid Loss: 3.05115 Valid RMSE: 1.66911 Valid MAE: 1.59058 time stamp: 27.654117107391357

Epoch 0 Finished (Average Loss: 3.6482)

[Validation Results] Global Steps: 399 Epoch: 1 Valid Loss: 1.59317 Valid RMSE: 2.51561 Valid MAE: 2.41958 time stamp: 42.38446760177612

[Validation Results] Global Steps: 799 Epoch: 1 Valid Loss: 2.18622 Valid RMSE: 2.14294 Valid MAE: 2.02721 time stamp: 55.99804997444153

Epoch 1 Finished (Average Loss: 2.8335)

[Validation Results] Global Steps: 399 Epoch: 2 Valid Loss: 2.68127 Valid RMSE: 2.21093 Valid MAE: 2.03893 time stamp: 70.67771553993225

[Validation Results] Global Steps: 799 Epoch: 2 Valid Loss: 3.33464 Valid RMSE: 4.01860 Valid MAE: 3.82281 time stamp: 84.29553318023682

Epoch 2 Finished (Average Loss: 2.5757)

[Validation Results] Global Steps: 399 Epoch: 3 Valid Loss: 1.68288 Valid RMSE: 2.70269 Valid MAE: 2.58354 time stamp: 98.95309257507324

[Validation Results] Global Steps: 799 Epoch: 3 Valid Loss: 1.96136 Valid RMSE: 2.66983 Valid MAE: 2.49517 time stamp: 112.45902109146118

Epoch 3 Finished (Average Loss: 2.4113)


</div>
</details>

- Decoder에서 self-attention 연산 시 0-padded data (item, degree)를 처리하기 위해 pad masking을 적용하는 것은 옳은 것이라는 생각이 듦.
- 하지만 (기존 Transformer처럼) 다음 token 정보를 가려주기 위해 subsequent masking을 사용하는 것이 현재 시나리오에서 적합한 것인지가 의문이 듦.
  - decoder에서 생성하는 정보는 sequential data가 아니고, 입력에 대응되는 item들의 rating 값.
  - decoder에서 입력으로 들어오는 item은 sequential data가 아니고, encoder의 입력으로 들어온 sequential data (user sequence)의 user들이 상호작용한 모든 item list임.
  - **decoder에서 masking을 적용하는 것이 올바른지?**

-----

## 2. Memory (CPU main memory)

- 현재까지 실험은 비교적 작은 Ciao dataset으로 진행 중. (`config.py`)
```python
         "dataset":{
            "train":53393,
            "dev":8489,
            "test":8428,
         },
         "model":{
            "num_user": 7317,
            "max_degree_user": 804,
            "num_item": 105114,
            "max_degree_item": 915,
            "d_model": 64,          # MHA dim (Linear modules in Attention Network) & Embedding dim 
            "d_ffn": 32,            # FFN dim
            "num_heads": 2,
            "dropout": 0.2,         # Inside FFN, decoder_layer & encoder_layer (applied after linear & attention)
            "num_layers": 2
         }
Decoder 측의 masking을 제거한 경우 96/100 epoch에서 Killed.
``` Training (689 / 835 Steps) (loss=1.28404): 83%|| 690/835 [12:53<1:04:40, 26.76s/it]Killed ``` ```shell [171120.454480] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/user@1000.service,task=python,pid=368048,uid=1000 [171120.454511] Out of memory: Killed process 368048 (python) total-vm:38612660kB, anon-rss:27963008kB, file-rss:63984kB, shmem-rss:72kB, UID:1000 pgtables:59740kB oom_score_adj:0 [171121.018028] loop14: detected capacity change from 0 to 8 ```
Encoder, Decoder의 masking을 모두 사용한 경우 11/100 epoch에서 Killed.
``` Training (723 / 835 Steps) (loss=100063536.00000): 87%|| 724/835 [09:02<17:14, 9.32s/it]Killed ``` ```shell [185016.694531] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/user@1000.service,task=python,pid=387915,uid=1000 [185016.694558] Out of memory: Killed process 387915 (python) total-vm:38593248kB, anon-rss:28063544kB, file-rss:66076kB, shmem-rss:20kB, UID:1000 pgtables:59640kB oom_score_adj:0 [185017.395338] loop14: detected capacity change from 0 to 8 ```
skdbsxir commented 11 months ago

Feedback

  1. masking이 제대로 적용되지 않는 것으로 보임. 수정필요

    • 현재는 decoder last layer에서 return을 할때 masking $\rightarrow$ bias $\rightarrow$ score mean 해서 return 중.
    • 이렇게 하였을때, return 되는 score가 전부 -10000, -9999가 되어서 출력됨. (outputs[0][0])
      tensor([-10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000.,  -9999., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000.,  -9999.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999., -10000.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999., -10000.,
      -10000.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999.,  -9999., -10000.,  -9999.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999., -10000.,  -9999.,  -9999.,  -9999., -10000.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999., -10000.,
       -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,
      -10000.,  -9999., -10000.,  -9999.,  -9999.,  -9999.,  -9999.,  -9999.,
       -9999., -10000.,  -9999., -10000.,  -9999.,  -9999.,  -9999.,  -9999.,
       -9999., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000., -10000., -10000., -10000., -10000., -10000., -10000.,
      -10000., -10000.]
    • 값 전체가 -10000 이 씌워지는 것은 현재 masking이 제대로 이뤄지지 않고 있다는 점.
  2. Memory $\rightarrow$ mask 생성 후에 전달 시, 생성 후에 delete로 지울 것.

    • 정확한 원인은 아닐 수 있지만, 우선 지워서 다시 memory consumption 확인해볼것.
skdbsxir commented 11 months ago

230926 처리 완료