diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..2321c30 --- /dev/null +++ b/Pipfile @@ -0,0 +1,13 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +torch = "*" +numpy = "*" + +[requires] +python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..aafabe0 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,70 @@ +{ + "_meta": { + "hash": { + "sha256": "3be011e0d66a2db2fc86c9454891ca8da0bb70018ae828e6a08d97fc6e744a14" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "numpy": { + "hashes": [ + "sha256:0df89ca13c25eaa1621a3f09af4c8ba20da849692dcae184cb55e80952c453fb", + "sha256:154c35f195fd3e1fad2569930ca51907057ae35e03938f89a8aedae91dd1b7c7", + "sha256:18e84323cdb8de3325e741a7a8dd4a82db74fde363dce32b625324c7b32aa6d7", + "sha256:1e8956c37fc138d65ded2d96ab3949bd49038cc6e8a4494b1515b0ba88c91565", + "sha256:23557bdbca3ccbde3abaa12a6e82299bc92d2b9139011f8c16ca1bb8c75d1e95", + "sha256:24fd645a5e5d224aa6e39d93e4a722fafa9160154f296fd5ef9580191c755053", + "sha256:36e36b6868e4440760d4b9b44587ea1dc1f06532858d10abba98e851e154ca70", + "sha256:3d734559db35aa3697dadcea492a423118c5c55d176da2f3be9c98d4803fc2a7", + "sha256:416a2070acf3a2b5d586f9a6507bb97e33574df5bd7508ea970bbf4fc563fa52", + "sha256:4a22dc3f5221a644dfe4a63bf990052cc674ef12a157b1056969079985c92816", + "sha256:4d8d3e5aa6087490912c14a3c10fbdd380b40b421c13920ff468163bc50e016f", + "sha256:4f41fd159fba1245e1958a99d349df49c616b133636e0cf668f169bce2aeac2d", + "sha256:561ef098c50f91fbac2cc9305b68c915e9eb915a74d9038ecf8af274d748f76f", + "sha256:56994e14b386b5c0a9b875a76d22d707b315fa037affc7819cda08b6d0489756", + "sha256:73a1f2a529604c50c262179fcca59c87a05ff4614fe8a15c186934d84d09d9a5", + "sha256:7da99445fd890206bfcc7419f79871ba8e73d9d9e6b82fe09980bc5bb4efc35f", + "sha256:99d59e0bcadac4aa3280616591fb7bcd560e2218f5e31d5223a2e12a1425d495", + "sha256:a4cc09489843c70b22e8373ca3dfa52b3fab778b57cf81462f1203b0852e95e3", + "sha256:a61dc29cfca9831a03442a21d4b5fd77e3067beca4b5f81f1a89a04a71cf93fa", + "sha256:b1853df739b32fa913cc59ad9137caa9cc3d97ff871e2bbd89c2a2a1d4a69451", + "sha256:b1f44c335532c0581b77491b7715a871d0dd72e97487ac0f57337ccf3ab3469b", + "sha256:b261e0cb0d6faa8fd6863af26d30351fd2ffdb15b82e51e81e96b9e9e2e7ba16", + "sha256:c857ae5dba375ea26a6228f98c195fec0898a0fd91bcf0e8a0cae6d9faf3eca7", + "sha256:cf5bb4a7d53a71bb6a0144d31df784a973b36d8687d615ef6a7e9b1809917a9b", + "sha256:db9814ff0457b46f2e1d494c1efa4111ca089e08c8b983635ebffb9c1573361f", + "sha256:df04f4bad8a359daa2ff74f8108ea051670cafbca533bb2636c58b16e962989e", + "sha256:ecf81720934a0e18526177e645cbd6a8a21bb0ddc887ff9738de07a1df5c6b61", + "sha256:edfa6fba9157e0e3be0f40168eb142511012683ac3dc82420bee4a3f3981b30e" + ], + "index": "pypi", + "version": "==1.15.4" + }, + "torch": { + "hashes": [ + "sha256:012a9c7efce86c7a0ce78cd7945fe7c798049537fc3e85af9f14e8789d13c17f", + "sha256:4aadc7124afc431ac6a227a05dc8eff417b6fd8f90fc6c44d514ddfca9a6b474", + "sha256:53e12607830ccb1e5fc4076aafe19bdbbc380799793fbaad696714b72859bde6", + "sha256:7e73a141bf817c0a914131dec51ea24a2f1946b96749b003af664230a9b95197", + "sha256:cb92ac65fcc7685fa6c5920b24101182dcb706d841fc6154ada604f749b615e3", + "sha256:cedbc382a0e992a169c73d2c469887c2e5ce0c6fa88b1dabe8f9021e1acb564f", + "sha256:ded9e2e59c086127423c23e902e2bec42b3b443a0e458fae76c013f62a7e0748", + "sha256:df005dff3e3f12911630e48e0e75d3594a424a317d785b49426c23d0810a4682", + "sha256:f4196ce8ba17797f3c2d13c0d53cf461a8e32f6130a08e6e4ce917637afccdc6" + ], + "index": "pypi", + "version": "==1.0.0" + } + }, + "develop": {} +} diff --git a/README.md b/README.md index ddccc6b..0999d91 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,10 @@ The model is based on deep AutoEncoders. ## Requirements * Python 3.6 -* [Pytorch](http://pytorch.org/) +* [Pytorch](http://pytorch.org/): `pipenv install` * CUDA (recommended version >= 8.0) + ## Training using mixed precision with Tensor Cores * You would need NVIDIA Volta-based GPU * Checkout [mixed precision branch](https://github.com/NVIDIA/DeepRecommender/tree/mp_branch) diff --git a/run.py b/run.py index 471b673..052bc65 100644 --- a/run.py +++ b/run.py @@ -71,8 +71,8 @@ def do_eval(encoder, evaluation_data_layer): targets = Variable(eval.cuda().to_dense() if use_gpu else eval.to_dense()) outputs = encoder(inputs) loss, num_ratings = model.MSEloss(outputs, targets) - total_epoch_loss += loss.data[0] - denom += num_ratings.data[0] + total_epoch_loss += loss.item() + denom += num_ratings.item() return sqrt(total_epoch_loss / denom) def log_var_and_grad_summaries(logger, layers, global_step, prefix, log_histograms=False): @@ -195,7 +195,7 @@ def main(): loss.backward() optimizer.step() global_step += 1 - t_loss += loss.data[0] + t_loss += loss.item() t_loss_denom += 1 if i % args.summary_frequency == 0: @@ -209,7 +209,7 @@ def main(): log_var_and_grad_summaries(logger, rencoder.decode_w, global_step, "Decode_W") log_var_and_grad_summaries(logger, rencoder.decode_b, global_step, "Decode_b") - total_epoch_loss += loss.data[0] + total_epoch_loss += loss.item() denom += 1 #if args.aug_step > 0 and i % args.aug_step == 0 and i > 0: diff --git a/test/test_model.py b/test/test_model.py index 6f54f5f..ab72385 100644 --- a/test/test_model.py +++ b/test/test_model.py @@ -31,7 +31,7 @@ def test_CPU(self): loss = loss / num_ratings loss.backward() optimizer.step() - print('[%d, %5d] loss: %.7f' % (epoch, i, loss.data[0])) + print('[%d, %5d] loss: %.7f' % (epoch, i, loss.item())) def test_GPU(self): print("iRecAutoEncoderTest Test on GPU started") @@ -56,7 +56,7 @@ def test_GPU(self): loss = loss / num_ratings loss.backward() optimizer.step() - total_epoch_loss += loss.data[0] + total_epoch_loss += loss.item() denom += 1 print("Total epoch {} loss: {}".format(epoch, total_epoch_loss/denom)) @@ -81,7 +81,7 @@ def test_CPU(self): loss = loss / num_ratings loss.backward() optimizer.step() - print('[%d, %5d] loss: %.7f' % (epoch, i, loss.data[0])) + print('[%d, %5d] loss: %.7f' % (epoch, i, loss.item())) if i == 5: # too much compute for CPU break @@ -108,7 +108,7 @@ def test_GPU(self): loss = loss / num_ratings loss.backward() optimizer.step() - total_epoch_loss += loss.data[0] + total_epoch_loss += loss.item() denom += 1 print("Total epoch {} loss: {}".format(epoch, total_epoch_loss / denom))