From 2dd734b87bba3496a59e50d7cca71c8ed5891d82 Mon Sep 17 00:00:00 2001 From: deng Date: Wed, 22 Feb 2023 16:26:02 +0800 Subject: [PATCH] update server data --- .../artifacts/code/train.py | 82 +++++++++++++++ .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/train.py | 82 +++++++++++++++ .../artifacts/code/train.py | 83 +++++++++++++++ .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 83 +++++++++++++++ .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 83 +++++++++++++++ .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 83 +++++++++++++++ .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 83 +++++++++++++++ .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 83 +++++++++++++++ .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 98 ++++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 98 ++++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 96 +++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 83 +++++++++++++++ .../artifacts/model/MLmodel | 16 +++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3987 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 96 +++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 96 +++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 96 +++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 96 +++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 98 ++++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 96 +++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + .../artifacts/code/train.py | 96 +++++++++++++++++ .../artifacts/model/MLmodel | 21 ++++ .../artifacts/model/conda.yaml | 11 ++ .../artifacts/model/data/model.pth | Bin 0 -> 3795 bytes .../model/data/pickle_module_info.txt | 1 + .../artifacts/model/python_env.yaml | 7 ++ .../artifacts/model/requirements.txt | 4 + mlflow.db | Bin 417792 -> 974848 bytes 134 files changed, 2502 insertions(+) create mode 100644 artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/code/train.py create mode 100644 artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/MLmodel create mode 100644 artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/conda.yaml create mode 100644 artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/data/model.pth create mode 100644 artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/python_env.yaml create mode 100644 artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/requirements.txt create mode 100644 artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/MLmodel create mode 100644 artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/conda.yaml create mode 100644 artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/data/model.pth create mode 100644 artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/python_env.yaml create mode 100644 artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/requirements.txt create mode 100644 artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/train.py create mode 100644 artifacts/1/c248a4299f97423987a9496a2241ab1a/artifacts/code/train.py create mode 100644 artifacts/1/c248a4299f97423987a9496a2241ab1a/artifacts/model/MLmodel create mode 100644 artifacts/1/c248a4299f97423987a9496a2241ab1a/artifacts/model/conda.yaml create mode 100644 artifacts/1/c248a4299f97423987a9496a2241ab1a/artifacts/model/data/model.pth create mode 100644 artifacts/1/c248a4299f97423987a9496a2241ab1a/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/1/c248a4299f97423987a9496a2241ab1a/artifacts/model/python_env.yaml create mode 100644 artifacts/1/c248a4299f97423987a9496a2241ab1a/artifacts/model/requirements.txt create mode 100644 artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/code/train.py create mode 100644 artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/MLmodel create mode 100644 artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/conda.yaml create mode 100644 artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/data/model.pth create mode 100644 artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/python_env.yaml create mode 100644 artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/requirements.txt create mode 100644 artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/code/train.py create mode 100644 artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/MLmodel create mode 100644 artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/conda.yaml create mode 100644 artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/data/model.pth create mode 100644 artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/python_env.yaml create mode 100644 artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/requirements.txt create mode 100644 artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/code/train.py create mode 100644 artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/MLmodel create mode 100644 artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/conda.yaml create mode 100644 artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/data/model.pth create mode 100644 artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/python_env.yaml create mode 100644 artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/requirements.txt create mode 100644 artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/code/train.py create mode 100644 artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/MLmodel create mode 100644 artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/conda.yaml create mode 100644 artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/data/model.pth create mode 100644 artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/python_env.yaml create mode 100644 artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/requirements.txt create mode 100644 artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/code/train.py create mode 100644 artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/MLmodel create mode 100644 artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/conda.yaml create mode 100644 artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/data/model.pth create mode 100644 artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/python_env.yaml create mode 100644 artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/requirements.txt create mode 100644 artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/code/train.py create mode 100644 artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/MLmodel create mode 100644 artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/conda.yaml create mode 100644 artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/data/model.pth create mode 100644 artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/python_env.yaml create mode 100644 artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/requirements.txt create mode 100644 artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/code/train.py create mode 100644 artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/MLmodel create mode 100644 artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/conda.yaml create mode 100644 artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/data/model.pth create mode 100644 artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/python_env.yaml create mode 100644 artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/requirements.txt create mode 100644 artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/code/train.py create mode 100644 artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/MLmodel create mode 100644 artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/conda.yaml create mode 100644 artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/data/model.pth create mode 100644 artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/python_env.yaml create mode 100644 artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/requirements.txt create mode 100644 artifacts/3/80447ac20c814d10a470208e303ea0ec/artifacts/code/train.py create mode 100644 artifacts/3/80447ac20c814d10a470208e303ea0ec/artifacts/model/MLmodel create mode 100644 artifacts/3/80447ac20c814d10a470208e303ea0ec/artifacts/model/conda.yaml create mode 100644 artifacts/3/80447ac20c814d10a470208e303ea0ec/artifacts/model/data/model.pth create mode 100644 artifacts/3/80447ac20c814d10a470208e303ea0ec/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/80447ac20c814d10a470208e303ea0ec/artifacts/model/python_env.yaml create mode 100644 artifacts/3/80447ac20c814d10a470208e303ea0ec/artifacts/model/requirements.txt create mode 100644 artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/code/train.py create mode 100644 artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/MLmodel create mode 100644 artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/conda.yaml create mode 100644 artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/data/model.pth create mode 100644 artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/python_env.yaml create mode 100644 artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/requirements.txt create mode 100644 artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/code/train.py create mode 100644 artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/MLmodel create mode 100644 artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/conda.yaml create mode 100644 artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/data/model.pth create mode 100644 artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/python_env.yaml create mode 100644 artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/requirements.txt create mode 100644 artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/code/train.py create mode 100644 artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/MLmodel create mode 100644 artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/conda.yaml create mode 100644 artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/data/model.pth create mode 100644 artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/python_env.yaml create mode 100644 artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/requirements.txt create mode 100644 artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/code/train.py create mode 100644 artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/MLmodel create mode 100644 artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/conda.yaml create mode 100644 artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/data/model.pth create mode 100644 artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/python_env.yaml create mode 100644 artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/requirements.txt create mode 100644 artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/code/train.py create mode 100644 artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/MLmodel create mode 100644 artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/conda.yaml create mode 100644 artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/data/model.pth create mode 100644 artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/python_env.yaml create mode 100644 artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/requirements.txt create mode 100644 artifacts/3/c362618cffca44f69a4afabcd45defd7/artifacts/code/train.py create mode 100644 artifacts/3/c362618cffca44f69a4afabcd45defd7/artifacts/model/MLmodel create mode 100644 artifacts/3/c362618cffca44f69a4afabcd45defd7/artifacts/model/conda.yaml create mode 100644 artifacts/3/c362618cffca44f69a4afabcd45defd7/artifacts/model/data/model.pth create mode 100644 artifacts/3/c362618cffca44f69a4afabcd45defd7/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/c362618cffca44f69a4afabcd45defd7/artifacts/model/python_env.yaml create mode 100644 artifacts/3/c362618cffca44f69a4afabcd45defd7/artifacts/model/requirements.txt create mode 100644 artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/code/train.py create mode 100644 artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/MLmodel create mode 100644 artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/conda.yaml create mode 100644 artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/data/model.pth create mode 100644 artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/data/pickle_module_info.txt create mode 100644 artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/python_env.yaml create mode 100644 artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/requirements.txt diff --git a/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/code/train.py b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/code/train.py new file mode 100644 index 0000000..bab8b6b --- /dev/null +++ b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/code/train.py @@ -0,0 +1,82 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +from tqdm import tqdm +import mlflow + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(10, 5) + self.fc2 = nn.Linear(5, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=i) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(10), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=10) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + + # start the MLflow run + with mlflow.start_run(): + + # train the model and log the loss + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + + # log trained model + mlflow.pytorch.log_model(model, 'model') + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/MLmodel b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/MLmodel new file mode 100644 index 0000000..59094e8 --- /dev/null +++ b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/MLmodel @@ -0,0 +1,16 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 18b69aa38c064c579c9b465d7a826081 +run_id: 410d85525e5f4cfe9839a432d35f9ad2 +utc_time_created: '2023-02-22 00:42:48.668457' diff --git a/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/conda.yaml b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/data/model.pth b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..40c18c59bb65a840d6de62aaadfd0a24b8246e33 GIT binary patch literal 3987 zcmbtXeUKEz6`$GT4jh3)KEwdRA(1Qr_HOS3PGA@BAVZqd9TT?sT{XY8r-tTqyB;}e3f-q^4a7mjg%oKX;jA1rrbgD-Rd9$l?nsE1+wmXzg zo3@)NTFT9tG-qj=M0XSn2}HF9{U;0x zp)|FNX%exl2s(F7!wLSS+jv)knlel%L9HsGhNk&Kng(?$ivb68W)~(pY6JFfYHiMD z^p(*SZMxp7XWHAF+V!^9XmmwXZ!`4vHkg#4aFqhmcu{Cs-Jz1dc+D}WLv@M^zM4oS zm>ec`WTHBe`_0%G7fewXW3M4&WOJ6$pf@y@tD3hiTk|K*RJh%urxvSQcdgf1*4=u1RZY zoK8EEVX+qpW~pr$0~M&aQy6+MG;}01bW{)pS~GNHLPpGBFSJw8YW;pFQ{(sRGQvgy zu2t($*VHk&QJCEi*D3Ica6*>kT3MtpC#=@uwBr_xBFrTrQm=-vZ&@&p>)nc==|#An zvmu*~!u;T^85U4zP?4#EW0+Z3ScV(aW!P)n>=;F-u`j3FTE?)t8w)!qv8_gGI8^H~ zv!>nKNQ+2`NMQ#oBK2}TnZ;dA6{m{RMffDaMc$~uV)ZJtrUiM{;8SG?FQKqRflrrU zX;{6Q&ldD_Uhg(ASIZJX?kv5B^_L?LeEwx~CL4&5MQ$Q7ewuh~7(E5LLrWW`DM2Ip zYAQpNLbC!b<0%Go9Hv4QBU?#J3EE1qB21Peu9NwK!PU)Rg)8|GmRLm70>ZVc^;}A~ zEE{Q!)N*j;HyCSJx_yV$E2Ga!>`VS;56;$;$&Yvgsvn=mdAOX7&I zQye-fmP9IIZ3ORZyk_`a#7el8G3z!35{WY09wzfS^SN_Kav~QE(}g<-5?dh)RS|9X z!Nz{rL>3WQo{8=lpCpm}CWx?^nY&YgyOtm=RRumzmL?LocipYPJ*1V~Q-XU-u!ZGb zCM!8oEY-vDY$cdgjjT?Piy0%a1VL2qBZ#6-lBA0y%aBqa?I0i-2FMha56v-c$|%GD zH?~05EkSob5ENLl2XZCY7WQFfMV7O=AwTHnsh}58i(++xnNHiLY4FXy_nGBetD)U^}@IZB4cQ!O%LT7Yh6`z~<}-Hg5;m z{3^iaodBD20XFXj*qkTN$+hHpS#(pbn~EgmiIY~;ul@Z7yw$NMIqtP|vaq)5TH4su z)w%kTOX-+9>gBrsIPg}bZTgAW*+YHtyQUrXlH_`?XTisnzi1@>?0bXWpMUe;%BsFX zW%-5u@yNXP_`)Y2UNhywb(P5LAI1K2dPe-!LTBvn``3B%Hd^ryc0E(MP+SwAd;e3h z1KXy@53kxAf35X*vA*-iPu={-ld;B4HSvy#yJN>b^kTCHw|WQPzt=myXREj5#*p_{ zdH(4q_MP+wHz=_?UlQV{{=F!^_>IHfY4WJoITZ3b&NQug{Nr<#a^0?YeZIq!b~T^6 zW%CxV{*hN=Ctn1Q0r>vef4*=AcNz9v4#0RdfYGkbRsRQoAABf#zg{uJJ9b~WvhC3M z%Gtjq<7_S4QU@l@#C5Rea%*X>UQ2UVXXFak^4_`|PCqdFA@8Gqy}f22dC>dAxf9&K zT6uHM75i_wa{n(sy{p3FeP{iKrR;jjp7G&>`BTZ`@8r}S6x=@S~t4!PmzmXcw=>|8O3gtBkeF2>4w{EycBE#9T8 zG^1lRt1~xRGlShK&E~P1)j1fg`KQsEEn_vS@nhGXk+uoDzRw_INx80WSuj7pX8A=) n_T9tU@V~}xblA=Z_E3*~C<;+_=f=jSlX5K=uR|>+@5}xVO4!Y? literal 0 HcmV?d00001 diff --git a/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/data/pickle_module_info.txt b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/python_env.yaml b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/requirements.txt b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/0/410d85525e5f4cfe9839a432d35f9ad2/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/MLmodel b/artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/MLmodel new file mode 100644 index 0000000..9224ce7 --- /dev/null +++ b/artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/MLmodel @@ -0,0 +1,16 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 957e2f6e4fd048c99aee3150c73c4078 +run_id: c4fd84a025e1474d87cdc2919874b88c +utc_time_created: '2023-02-22 00:41:33.282088' diff --git a/artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/conda.yaml b/artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/data/model.pth b/artifacts/0/c4fd84a025e1474d87cdc2919874b88c/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..4356bc1b7641eb91e836f9620a4de98155769ae0 GIT binary patch literal 3987 zcmbtXdyo`I8Q^_ksWGeg@awEM!k zZrW}-m(}}Bqp9LuRQt6)Lv{KL)1bDc>Zay6B7~y4s;1nmNwb!!igYk%h#)9c=s#&t z2!iuDn$Wpx8cy&pZsJ`Ls)|rufQTZZhN}8PstPp+nKdvaNnxrC;$%^%8O@=hzj)O#s6#c13!X;A z0!)vR8d9s&a=&RCHd1bQD@2*je1gdQ9V11R7=+;X^XaiAsVL!k-{jOI5n6 z|_ALu;mDH?V_wr-|2w(VwG(s&1I32r=~4 zT!a=1tunMtrWnw1lnND$Y$t66SXF?JM#)OVbvj=#xSAQPa5W#o5^GY`fN*P+dM>3| zmW{MVYB{*_jso1O)bWYF0VJ~Knv{)qCIh1tV{4PF0?3SH01%eHgGqojc|pF4*hPUO5{x^NdkV$0-aML^qo zVM__NlEp-l=Ab*qCsAO(Y5}$}b9c+|$z@1OMTSq2<;f)OUE5{YLE6cV0_-fnE|z@rgMg$NATwA#RL8U_qYwk! z*aaE40KFw3D6s4RWDD@=s1GYEvaHn$eFyzK<+MC%QLIidb=@{igKu7rxH+FT@z$5BkL`{a#C(4!=!D(26M^{%)NyN2W}Ql)}e+)@!a4tjP?NI&Ji3DA-@ZpB2XDz zpV=v_SC&te*mj=-d${ERWiGRvb<~V&n(8f_Voo2uyVts)dLZKVPXMM>X5VsgEMQNAS(7};Jz;ZR^gb!pagL^W@)BPFd~ zNvH^iClSFMId)#%(<;J4(I~Gd2PuzRCLHlq#BL0YZt(|2ILdk749ECBujgDiF11ql z++A3A5lJk;=ke$eO7QR@zR)jFctnOT9^{=zhv0+^CwVQUvYG>5B8LgOB}a&Fwgny| z$E65`$GN#8JRu21c+xlZ6ooI#aLPAzdI+AD;VUljx%X891gZ43B0M9*v&5&(b7XIl z_(XV~_!<8?@pJnE@ssxr;wR?}@$>ObUI};|$ru{NZP9@jC6RBUwoAtbUy>qjirhq4 zX1-N`Z&zgIJ5h3ILR78rvLDqeEGj{Yl;FGUbS=U6{K&pf;Z+%4^CSDg5Dd#uCKIt~ z0}rj>k^Dn$r3gP_*!4e z@qc*Pgnaff?+=;x%B7vL#NGSfT)U{cSU$I7gSTwk{=~)i--^F}YKwQVq1LNwXz(s{ zoExs|*f*Tse9}Ae&ho^?p`+#c-Omg!P5ftg_ag_qSAPF&eE-wGiSIi9c*5Is!n^#> zd&_M*{$Bp&ds^aG|5}uow&c&l+2)0bqkp_T(RpE!cWg#|VtDTM;o-$+I}b0Ay}>Cn z6XnZ!FPyt4k@@$MP6puoU$@OakGl+eJ_x`>C4ep6UAO)p0KRZ$XZeWm%!l0Q^*M$f&wNnXN) z8OHl&=k2}seBARpzjN>1UZu255UQ$#OIo#1FATZ~%Wg^-)M!i(*gf5~!u@mFVc5}69w8xXl)-}=gwe8WiwmZyZ3sl7@EKot3FA6hR z4N0>FmW6LoxSm3ThD;Sa%TB@#Ik-_oifzqxzto zwB4a5nn6l5rgy+{Qlr$6tGKIbv0AJX;UkVyS3A!07 zK@ZQ+)b;{*=ipN++~fNruyI6f=4G68Gebru0Sc*&5G<1tUM3|CI6tj#LKVmY`sLY8snbLY^@iJY-)AMPVaY?a)giD-Km zwv515vYaSNJ-TCjl0^0^6QPfp`?Lz5S%I|FRQN2pJr={g>wXm;Agjp(S@>KQwz1qR zWDQ4(rFtr!2MK0XCmk^|oiWlCBZ%rl1W`0dFXv(P^R1O-;?f>ahBjs&o>B1<{_Ft8`cQ`*R&7RBlW+caIn$f zNSTKlj|BO6nO6c{N0OF7aa;7@gd*`x)b;7i;Dl1{$I11C zW#;=?_(4%-PDaSyIZ;L7l_07gvZzF*d<1^PPS+85HHhrT6n>(@Ye8hMkHRSx@?+aWf;3$ZyDV)G6;p_G#eMfBsoA8+hcDy#n7x@qg(c&lSi@4VO2MZ&tGYiUz+ zPj|;9m(n?R)XQ}resh1p?B6dpjGZ{uzPVBUPhOW_s(MsjCkUOJ>)-0qGHLnv>r3Qu z$tg^Dhw?q~7xN1ypY0s4dq!Tp`)^(2>kb$G@P4hV-ZWTvqCMS>SGbl7yQ&Lk&(w5X_{aG|=U>m~-|H-JEFL^~amy9^ zZ@qH=AC7f!e<#naI>oN1?3q8_#ll@-yxZBK<~lvyT~`?J95S~`4DEAA`uo^TnmxUW z$o{6k>59vWUF&8y{wXs3g*R8Xm{IITInxedk?|XQ~x@< g(P4Whw1;}^Ls4j9cW!KKx>qUZ;uWaHjTWghlg(ncn087*3ilkLr$MvG;*15Q6KJ zdek*FOl}OOmEmJDTpvkFqEsgd6sAX%I-GXgyitG|Butu>F!n7AW^%n-5j3p;ALney z=rNcTytTt@3M~pUHRKp(25u<99AzQ)qMIC};6!(1HCs&^R!=nFPl;_sso_wy*UXr9 zUz8S*5^ec@m`j?aW^yfe)g&|tQv~<~!9{*jhIz_(w5A4mR$+b#BCQl!W%yJP7DSW@ zd^WG?IjzUQTrErnxwEuh)?b7?@cEa?nrxtr%ypB=vD3tB!|2V^epNS2Q-mn`T3mt{ zg?1S_#!?LEI7EdiMlK;8MOa#dWf8Inah=E)46bGdD_qWpu*BL_H6YvyrI|}v&15TDTZGRxhUvoX1c@z^8x#R;?|=e+?h>SA&>aLM%>Zd+`A{9xri?-iaAPZE z+#>XpfuKO^Zpaqlo`?@CE3&NB1G&9^p7L4&wJ266n7VG8rolHaN4%|&HVQ_1ZC1ye z^djpmzj9J;Cc~s{!Upro4Cda#g9A4UC+kqdqIhm_8Af}65$6bwh)~!HP6?=%{kY}T~3bhXH^k^8vVE#j}`%Wx2n4xtPW?&AynI)#U1cz7@G92$T}WcUWJrBqgP;G1MWLAT@p@y*8ITjT+$ zj>4ndTnQeNgc3aNn>tM4+cF&SO&uM8@5u07m-yWK9sz<>dZGm1m*Gj`)8-i2kt9A5 zen9+;KSli9{*d^|J5K!MoFINae#9#QuOk^lqqr?P@U$fIP1JVj@Zd92otq-F3Cqln zi|}k!W==-PzEM%N!%zIEo?}r7Qe7FIXQyi!UhpG(k-|$dobn_4=>VLTp+ZJu(*Yh@ z!6W%++)4>vX4w4Pw=hWIj0~^%7Je}Rzm(xuL)e`4v3a!w=VW*-z~=Q~Y)4d~bz4z{Go4xpB%M$N&Ec8Ac*pqnT zANP6-k3Hqp#~-h}_s*omw%1oD&Q1Hzsf!c#dk43~5`Q_i-g{WsTT$k1j!(bickx5# zb|$<@?^hPRv1iq`2mci}=gjmz`tL?>t#LTscyhe=c4fZz;;Z|;V^7{+X=vExUHs?n z_=WMO;_ttgi8BD7vw#2Bv$)H!=Sl!3ssW63b>8%U02rRvTJ8pwY+82C&qnnGM@P8Pw_|3yqUPAWj6P}d{Y#z z+JDE@`@hC~i2FPJ%J~`Wddi-$<82JB4&vR;4mI2A>Wp7yz@y0AAu_bjAMV-2Zqn@O zmIU^9>6@;)tk|_~WaFPAm%i{u>sB+0-6)6KBUq%vy3xg>HLLSKQu8gmOIK;eMr&4Q zZlq=!yH%R)qcy8@FjDjFk(wQ&HLLMs*Ph|F5xc(6AYbQ74YB70V_J2*j%;*3B literal 0 HcmV?d00001 diff --git a/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/data/pickle_module_info.txt b/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/python_env.yaml b/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/requirements.txt b/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/2/b7d7395b6b53404497f7656b07b71bf8/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/code/train.py b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/code/train.py new file mode 100644 index 0000000..d13857d --- /dev/null +++ b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/code/train.py @@ -0,0 +1,83 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +from tqdm import tqdm +import mlflow + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(10, 5) + self.fc2 = nn.Linear(5, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=i) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(10), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=10) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('mlflow_testing') + + # start the MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + + # log trained model + mlflow.pytorch.log_model(model, 'model') + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/MLmodel b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/MLmodel new file mode 100644 index 0000000..1843ee7 --- /dev/null +++ b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/MLmodel @@ -0,0 +1,16 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 2625ea164ff248c194686ed5afb9a510 +run_id: c293e8294f4f46adacd21465be08c608 +utc_time_created: '2023-02-22 01:11:28.646127' diff --git a/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/conda.yaml b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/data/model.pth b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..3d8e55d35e82005370a08d4c4877f90ecb05ce3d GIT binary patch literal 3987 zcmbtXeUKDK72nyrJz(H~5WWnNY=S0>f%}FNa2Ghj0Zy`62G9wJ!|cxN^?GwN`*wOb z4%rBXT@EB*L=w#h9BL9tG(-%b!cE8}B={A9f3Qj_r6pyVKP*eDQfm1}eBCq0?HzSg zQTEoaumitk*TF)#W?Q_O{8PjU(F5a3*8g zuAa|jI!&Xl;$2j`v`#~HIt|mHwxwoF&2dBs#WJdzc5^1pS*j}1p1dJ~pj4s%q(LE^ zp>`od>MW}cox7&t1pneAyemRg395?_QAE^GRbNO|p+;db;DE;L!Wc)1Vqa@XYuV<7 z3yjv5mX-#+HEn2mLqlup!t|o%bd%l+W0Mrd$smpvg__kID*B689fLYlqqyMlL@dID z7^xv+lrh||Zev_ftK5&hsBUC)mJ!vWPOd9&8d1w|3z~_4wA(IpMmelem>4WMXXPmB zP8w|u0g_qQ%Fvu`i7+`fy67OZKCpLi7b`H0>k(*}Qi3~Wm>QD=DTF^ks+OuUY6hn> zj%ZlyMTBX}0*rx%sIVh6@I-i^FFbH8B!p3qX)R1GCS-7_Z_bKzRSHHnA3QqmDoMx-KVRh8!dnmE3dTKaS?J~2b z-Ca)$NQt_956mHxq)B8NcQsL%C`=LHQv?_JX<U#-TMe$g>I$lpr>j!dw|XQ-lX& z%6LAT*D{@2hk?18mke@eX*OFPk&jKpmOmCX=J5iPwhFm8U&w#xPA0>d{w2 z2^uLh$1N}6=AV5kxz7XBat=Nq-=aiGB8>(_PHdh08*O_0K)Qj+yaX~K3W6;nf;&> zL@dEl8J3k`xiW+Ktk^(Q$4v)&0JLp}6@iZq(@tw9ThT*BSQ$eWiRA84y`c>(LAyXj zXy+Lk++JW+30BLn#&yf^`Lf)=%Q$Nny0wB15}6z$SSDd!CSj>cT7kTY;R3NF`a(N| zfn!2ZpaRxL@Xp4o2Hyp&gohck9+4rLEWx8OGMh7>JBJh}a=|cNSWA%DGPzd~(DpW1 zSBCXu4w0m(=#KG86xgp?fDO#t7i9S2T%@HU!(-&ZWD@tTjWTQ^Eo4&>zEp(GEcX&= z~9`k|ep2F%nM_M0E>66g83}?Icx#vM$ADmh`C~02e6saK-J)6s9;hl}DcYcE8G} zcPMwTX?{ScIz|`F7WwSs%3W;Mv^Bj_WXQB$nYRJUWCjd}}XX=phQ(O?>xN+o{`}@yq3~A&4KTdeFWW-{lquh2+xv( zQiQ^D+*}EsmxL0$;F~%^;iwFKzNuq-;CnKB-z7fxen5aAm0m2tOESDneA@hwY)cZK z2*-(^@mGkS+gFL7ydM!iIX@Oy7 zlOmj~$jnb;WbcTmn&1sTs#7c~L5h^&G&^0(aK?}9XB2)e!!P{E&hCM8GW3&?*ffKO zR`5uElUpgld4|nfzJ&n_Z_DtGZ{flocvpt^2C=#5WAn=r{7Qyj2iW{(2%Fyq*t{QL z^Sc0>O93{Q18lC46HQ;#ykY(B8J> zrc3FFJL;{vf9?CQ|IEy@ar?Pb{cE?M_KrKf-hZ9riTfTu6@MTSOr?}O{-<5knP#1Fr{)$^*8-dp?n`%nJqh4`j_ zAN0mulHz}lE%j!k=EVPS;obPlv#!RyI~%;zt1rf-(lT#Z-e?s0_g1d--mvrD#qB50zOt^azj*a2?=@M8 z_nhgCGXOsn7*jOJ;eDueoiPFqV{Z|j{PO!CH zd*`v2rs6u-bE~y9Rj#F}y{+yx*K%!oXzB8!PGZ-a|MH%0KObMb*uZYm>`6%i z`@8W?S6No9}__1rxP+N~(-)E4qlvGnQFPNWQHUEYr`|e?F@Ly#& fI&4=0d#J}g6hn>d&W(*tr=$oMuR$#)@5}xV1WVO{ literal 0 HcmV?d00001 diff --git a/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/data/pickle_module_info.txt b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/python_env.yaml b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/requirements.txt b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/2/c293e8294f4f46adacd21465be08c608/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/code/train.py b/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/code/train.py new file mode 100644 index 0000000..d13857d --- /dev/null +++ b/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/code/train.py @@ -0,0 +1,83 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +from tqdm import tqdm +import mlflow + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(10, 5) + self.fc2 = nn.Linear(5, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=i) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(10), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=10) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('mlflow_testing') + + # start the MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + + # log trained model + mlflow.pytorch.log_model(model, 'model') + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/MLmodel b/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/MLmodel new file mode 100644 index 0000000..e841ea5 --- /dev/null +++ b/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/MLmodel @@ -0,0 +1,16 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 2ee49fdb3ec647a58b1235498b186722 +run_id: d548729629634031a93a46d6dab8b7da +utc_time_created: '2023-02-22 01:11:33.149151' diff --git a/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/conda.yaml b/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/data/model.pth b/artifacts/2/d548729629634031a93a46d6dab8b7da/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..e265aa47f310e7089263e307e1ff31bda3ee2f5a GIT binary patch literal 3987 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 literal 0 HcmV?d00001 diff --git a/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/data/pickle_module_info.txt b/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/python_env.yaml b/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/requirements.txt b/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/0be79b1f3f7d480a9c7f497312887a37/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/code/train.py b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/code/train.py new file mode 100644 index 0000000..fb07727 --- /dev/null +++ b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/code/train.py @@ -0,0 +1,83 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +from tqdm import tqdm +import mlflow + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(10, 5) + self.fc2 = nn.Linear(5, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=i) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(10), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=10) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('train_fortune_predict_model') + + # start the MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + + # log trained model + mlflow.pytorch.log_model(model, 'model') + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/MLmodel b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/MLmodel new file mode 100644 index 0000000..ebb3022 --- /dev/null +++ b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/MLmodel @@ -0,0 +1,16 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 20196b21b65b400eac57135de7cb2bac +run_id: 2af28d45b569431ab10056469d63cf44 +utc_time_created: '2023-02-22 01:12:30.183766' diff --git a/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/conda.yaml b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/data/model.pth b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..3b653c03f4967ec96550b7945ba477fb4c3b4a2f GIT binary patch literal 3987 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 literal 0 HcmV?d00001 diff --git a/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/data/pickle_module_info.txt b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/python_env.yaml b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/requirements.txt b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/2af28d45b569431ab10056469d63cf44/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/code/train.py b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/code/train.py new file mode 100644 index 0000000..1538383 --- /dev/null +++ b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/code/train.py @@ -0,0 +1,98 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +import mlflow +from mlflow.models.signature import ModelSignature +from mlflow.types.schema import Schema, ColSpec +from tqdm import tqdm + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(5, 3) + self.fc2 = nn.Linear(3, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=epoch) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + batch_size = 10 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(5), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=batch_size) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('train_fortune_predict_model') + + # start a new MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + mlflow.log_param('batch_size', batch_size) + + # create a signature to record model input and output + input_schema = Schema([ + ColSpec('float', 'age'), + ColSpec('float', 'mood level'), + ColSpec('float', 'health level'), + ColSpec('float', 'hungry level'), + ColSpec('float', 'sexy level') + ]) + output_schema = Schema([ColSpec('float', 'fortune')]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + + # log trained model + mlflow.pytorch.log_model(model, 'model', signature=signature) + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/MLmodel b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/MLmodel new file mode 100644 index 0000000..6b7d705 --- /dev/null +++ b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 4dc69e8ee0404f70b0c17f8119986704 +run_id: 581cf34366f74ee7b90b18f0a606ddf8 +signature: + inputs: '[{"name": "age", "type": "float"}, {"name": "mood level", "type": "float"}, + {"name": "health level", "type": "float"}, {"name": "hungry level", "type": "float"}, + {"name": "sexy level", "type": "float"}]' + outputs: '[{"name": "fortune", "type": "float"}]' +utc_time_created: '2023-02-22 02:46:27.876394' diff --git a/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/conda.yaml b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/data/model.pth b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..17390b591698adda3627a441c230126baae47c4b GIT binary patch literal 3795 zcmbVPTX5V~8J2c!$5j(MN!t|KTwFqnLK5Fo*GZhVPU{wwZnjE8loTVhlGaD8EbYHK zies7$4e73(wvd*#gwk6=Xt|WqmP-gwn_wVN?%@H3;elaz-~}ESnBjq8;6LZc_S%`v z3^_X*>74Ul&j0=2f6m#gmTr)w=4R=V)*@XijfRfvcQ_Wc+KUB$XmGi7U{QNGW!ruj zJ4Mef_-=d6w_=W31=oxUuJ6(?Fm2z8A_XMXHqBh@`P2(cQ=#KUR{_~bqyLOcA!XCB zWRvzFXh-L3Rmf%)QiH*TM<>n;?2mV5w$2T_-dk*VW~=* z$P!}-_v?fh7c4Vw!Csr==Domev)UqWwCKBSfg6`BA76AVEEU=~tZmSeEZGY@in^`! z){r2Xj{}=}VW7ZrwZ7;qv;x=_+{I2z;{ymZtgOH_I$W!2vL@kA)*7_5ZQ3|(M~WM; z4+X9>wqOiYqVi#B=2&XxRBGn5Bug|sbE?6S9qgqJOJ<|!r<}CtH#yQC304_RsOwvp z+%CAj3h&V2ooYsF)Y6(v;Re-c#OWw5x+S=gq)4lg!hR6IYOc2nL9PFNY_49r>)DXw6LWY{Gjgpl+bBL5KI2VWVnX&1Z|2 zU9d)6%+;n$lDohfW&O>_1Hr$%=d*!!vOdma>ZggDg}?D`6L7)_po;G8NdZlC_-q+&N@9kxQ;0!~Fz_t&^J!8EqeeJym#stS6eb z3f(b2DKh&t$gr20`+yGnHXtnx9rlxrnGEh-2XuIl^pXe5@WC<+v)pT>k0ZrWJsZ!5 z2xiqJ+cIP>V`Lyh5Y-P8MA0HyGDNZ!$mw852#CV~S;q2VMt(>cg&5%OFy!Mhj8uW3 zz=osXmEj|*fRz=Q7mPq*Qsk*fCc9WjwnzXhNuEmhgdK>hxN+xX_7E3 zL~xK>9y3-k%U)#WW8XIy$iShDpnd{eqBzbKKWeOGinCKi5T8D5tYFjpfG{15 zE}1R!*(1gcY}OAgr&eU%$j7+Y!y@cU#6sN8gtMbu?&AWp+44BX2OmM2U3z@_d{b4# z-l{+a(^f6Rgh~pN#OHdGD&G>vTyKO>IG&g=W9s>lVwPNXq&VhWLKS$ljtJ%`3QOj} zZUr7wRbEjMQXaQVcwDF`Ll_#}BL)@t1m}Gxe3I|;b}@z%S}TPo?#H@IYmHTS5|0kK z3ZFX87y1;1r*(K{l6O8m0Vj3%46mh}XGQQVd6b}A@;DJ@yWq3rgqEi895+{i=QX(k zF9=gFQg}&+Q^M5g3HY22XJR6__jv*Ysq}IMUeVzTM9}7oj=xtn`QV~O=iBXlH-e_ z>V|KKsJ_XflC^Xd&a%_B3f~fuoulw=9lj$X`|bq1rNb0ij7<+rqZK@ozsIdq;5@_T z`@+Hug&*kfLt)`Z6L3L?AJ1a*6M@a!75J$RKTELr`8+niNU-^3g3YfIY<`_!b1}i@ zH{^9KP2SMtI2Xsc_N=y~`Q9^IPv3*LI`(AiUQ3rsx7S=tJ35C3w_S26U35piT=&&2 zyQZIg>Dcy-v@(6o`TtIxIr`YZU-$2ue!~0r)cJp$-Es87h3UWi_T=>B@b9Pl5BzZ| z`^tqK&h9_&cy0B?X}0L*yBp7K$I52U%ETV(u|HZ8 TBspNyS*?+aH=!1j7qb5Yt1NSu literal 0 HcmV?d00001 diff --git a/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/data/pickle_module_info.txt b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/python_env.yaml b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/requirements.txt b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/581cf34366f74ee7b90b18f0a606ddf8/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/code/train.py b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/code/train.py new file mode 100644 index 0000000..1538383 --- /dev/null +++ b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/code/train.py @@ -0,0 +1,98 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +import mlflow +from mlflow.models.signature import ModelSignature +from mlflow.types.schema import Schema, ColSpec +from tqdm import tqdm + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(5, 3) + self.fc2 = nn.Linear(3, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=epoch) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + batch_size = 10 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(5), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=batch_size) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('train_fortune_predict_model') + + # start a new MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + mlflow.log_param('batch_size', batch_size) + + # create a signature to record model input and output + input_schema = Schema([ + ColSpec('float', 'age'), + ColSpec('float', 'mood level'), + ColSpec('float', 'health level'), + ColSpec('float', 'hungry level'), + ColSpec('float', 'sexy level') + ]) + output_schema = Schema([ColSpec('float', 'fortune')]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + + # log trained model + mlflow.pytorch.log_model(model, 'model', signature=signature) + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/MLmodel b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/MLmodel new file mode 100644 index 0000000..88edd89 --- /dev/null +++ b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 1334c03425a6454fafce1db8fa3a2428 +run_id: 5c8b249efc724568aca1b8a4d8750b43 +signature: + inputs: '[{"name": "age", "type": "float"}, {"name": "mood level", "type": "float"}, + {"name": "health level", "type": "float"}, {"name": "hungry level", "type": "float"}, + {"name": "sexy level", "type": "float"}]' + outputs: '[{"name": "fortune", "type": "float"}]' +utc_time_created: '2023-02-22 02:46:24.939018' diff --git a/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/conda.yaml b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/data/model.pth b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..6d3534f2ebafa49f927444e67ca9df12cf80fd18 GIT binary patch literal 3795 zcmbVPdyo`I8K2p`J75BLfC(r;a*-J461cqwcOc{zIg%rBU|EKsW8!5pJ2QK|?%d3N zJ3SnyY#!q79Z5_~f}#<_;rkH*-;c-xb@$xe-cn1I z^w!i&cYlxme&6rw?#*h+7D-yZT)L*UOE*j7f#Z59$D&quspyRiua+KaXip?;+Y2J6 zRIrPl+g& zlWyPdM(2^|hVffDz`F`0tI$$`RzpDz(-cCc32g?80S7E*7nX%aC-(b$b_@&*I(fUd z&)Syn?a8@)*5Ho*+`ypg^bPD7faMtqD|AqrMPcTxkSb#FX6Vw8S`-(26HzL#QYCF< znX!!fbpnhFRvC9fzoI>W+v$#Xk>H!52mzUV|yE_QNQJE1*Za=|Z9)a_`t zh8W3wL17 z;5G`K1~OF&T`v!}SK(d87VM>tgl;)Z9V=LY>A3z_sx(PS;HRh?QghtPd%;ACmXQ+O zrAgRKI5d#a#zQRvd)t_s|(8aMITl4TdI zF&A^SB@^e)x5in2EAl|_FJJK3KsVVOWirjv#B0MHFVRWUc0Esl6#D9^LNA3r9r~Lo z#&n#gLLDQwk^Tw{RA5jgTM^fle8CV|UcAEXdzD! zft^M>pD0csk*&z1Yb`P?~VIg!h*7r`Nd#Ma5}hK#n4!QmP_NH!BqTZir# zpA?z>T4XrF%zZ$I4|X9f4IMs2?#^Uz?|Mjwhsieba0NbGfl-!wjcn&gu~g5;^9aGL znq*goEM$xfWeB4BC_xl0k|iS~TZNnsc8GvD43JeUA7>Q0F5kRDDX5K`Btcy4eRMtguI=Ln7{P#%S_3RH(kFgu6!%JONFASi}# zlv|!K)-lV4(9B1kXD*R}V;MpH7`Rw*k}H1HSj!aWr%K3kVfSNv`na)%P4ff7bTGPj zw!&v0Gd8eUFR+|?kwqhqbFn8x*w=^!xSa`SPjb1B3(V%r;{+f41k&u<gpzx_fSa(USwFb}Q(IMC1 zg_C@tFH$(A!>6Zt=QC4qT8Gc_TFMoy5I#qqBIuSpLxkC0c!@lxB`JKKo2$YZO|HTh zgsGP)oYi4Qm^wEFU)14C5fR+`G68~A`brhPs>9capv~9Gu?!JJ_y!Rf|0WT+{T30) zdxePPe4B`ToadE**O9zyQQQ_oxS+N2O*Dw;;^0Ls8Rf`rgk|PC75HvlX1=GAlMPYz z!S_W}KVVVGTCxT|WT$Hlek3CMF@>M#@KX`lt5fhZ9WIeZZ2Dmqt>BS-nOmvCYYdy8 z3k!1;exbuJg@r3q@GBjDJ&(=n0-N7d;kP>cF2?5fi`cvoWAld?n?J_b{3*uf%@~`j z50cq3>jCn+41eK%|80pblQJoXZmvW#O#4RBk8N_pG`mV%9WwhvlnJ(|DB(G z+}@L}-FH`-E&7hs=!$!=ve|RJMJx4-?j0F!ix+*gW5XrwFNby|FaPrrv-i^9&;FO4 z-R!xZy`A;;`bLHaZxDok-G4HD_Vupx)6QRqnEzLwf9w4J?Z5xV{qMVak;i>-_u2oj z>m7TV$GuA06UTj&9SVUzGCXvHfyboiS6I|-9*`w)nxWs_)k<%OLi?<+W1v| z;U7|?Zaq5~s*CM3l6+A&)zhe1&x56!`|&PXr`g-6S)akBnrD`3_BCqO=U}PkM(o!4 z>~GYp$B$hb7Tc)>%{XIOt*vcKJijTqbwQH-Z(wcyZL%8?wzaW6)MJ0NB#3jsrn6cr M7jHu?CNE_F2eJQhdjJ3c literal 0 HcmV?d00001 diff --git a/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/data/pickle_module_info.txt b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/python_env.yaml b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/requirements.txt b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/5c8b249efc724568aca1b8a4d8750b43/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/code/train.py b/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/code/train.py new file mode 100644 index 0000000..5e1ed6e --- /dev/null +++ b/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/code/train.py @@ -0,0 +1,96 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +import mlflow +from mlflow.models.signature import ModelSignature +from mlflow.types.schema import Schema, ColSpec +from tqdm import tqdm + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(5, 3) + self.fc2 = nn.Linear(3, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=epoch) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(5), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=10) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('train_fortune_predict_model') + + # start a new MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + + # create a signature to record model input and output + input_schema = Schema([ + ColSpec('float', 'age'), + ColSpec('float', 'mood level'), + ColSpec('float', 'health level'), + ColSpec('float', 'hungry level'), + ColSpec('float', 'sexy level') + ]) + output_schema = Schema([ColSpec('float', 'fortune')]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + + # log trained model + mlflow.pytorch.log_model(model, 'model', signature=signature) + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/MLmodel b/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/MLmodel new file mode 100644 index 0000000..620ce39 --- /dev/null +++ b/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 3f51fe9a1b40461d8c445f37695d72e2 +run_id: 7f0b13a30b10483589f7ca922050e721 +signature: + inputs: '[{"name": "age", "type": "float"}, {"name": "mood level", "type": "float"}, + {"name": "health level", "type": "float"}, {"name": "hungry level", "type": "float"}, + {"name": "sexy level", "type": "float"}]' + outputs: '[{"name": "fortune", "type": "float"}]' +utc_time_created: '2023-02-22 02:43:39.269378' diff --git a/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/conda.yaml b/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/data/model.pth b/artifacts/3/7f0b13a30b10483589f7ca922050e721/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..83522b1dd24b82c908e0ed3b0436a13ea5cf7c7a GIT binary patch literal 3795 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 O(OS898)`9mA^SfvRB=K8 literal 0 HcmV?d00001 diff --git a/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/data/pickle_module_info.txt b/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/python_env.yaml b/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/requirements.txt b/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/936ba15a1bf74591a10e1711133f4be4/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/code/train.py b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/code/train.py new file mode 100644 index 0000000..6848e44 --- /dev/null +++ b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/code/train.py @@ -0,0 +1,96 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +import mlflow +from mlflow.models.signature import ModelSignature +from mlflow.types.schema import Schema, ColSpec +from tqdm import tqdm + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(5, 3) + self.fc2 = nn.Linear(3, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=i) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(5), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=10) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('train_fortune_predict_model') + + # start a new MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + + # create a signature to record model input and output + input_schema = Schema([ + ColSpec('float', 'age'), + ColSpec('float', 'mood level'), + ColSpec('float', 'health level'), + ColSpec('float', 'hungry level'), + ColSpec('float', 'sexy level') + ]) + output_schema = Schema([ColSpec('float', 'fortune')]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + + # log trained model + mlflow.pytorch.log_model(model, 'model', signature=signature) + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/MLmodel b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/MLmodel new file mode 100644 index 0000000..5eaec8b --- /dev/null +++ b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: eb6ac492a8a5426d815dce50de4d2545 +run_id: 9ea595f0043a477bb635754b7f77fa48 +signature: + inputs: '[{"name": "age", "type": "float"}, {"name": "mood level", "type": "float"}, + {"name": "health level", "type": "float"}, {"name": "hungry level", "type": "float"}, + {"name": "sexy level", "type": "float"}]' + outputs: '[{"name": "fortune", "type": "float"}]' +utc_time_created: '2023-02-22 02:26:27.043234' diff --git a/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/conda.yaml b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/data/model.pth b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..97c3aff2d7ee9c8353a215e85e9858300e1dd750 GIT binary patch literal 3795 zcmbVP?UNKo8K2p`JIDm?;3Px=$pwTA25#^6UVso5bHqh6uv~_q6XH3}&dgq~J2$h> zP7lW^8-uue5R(vNOngDY8RL6QG|`yEta`q`#1N~jl$Pa(R!PT}wEGga?FErj zF4`r}?QQy2%n7UHnqkTHTpIYM?O9={fTY@{nU9JdE&8UZ(5bSkfNUhuf6k?luxU`S zNw4qsqVvde!}zTn;#~!jHE63syP=?lX$m3JgbstnfCCn@3(G>I2m5`y^MgBwhSOqUnju0V5PAYdp(X@DEe-X)e{yc%AVWfyHUmR@I@zsN~wp#+5?^Ol8b(kqHb5K zHN;33BHyOPz*k_E+FEoDS^?~8?qWZt@h$`!x@+(@9oDFttV#HjwKgqjn>J3{q2l`N zLxJmzA&h}aR6Z%qo=(hOOw7(mvP6@!7uy`!!CvB|WVVZb!bysLha(-4V6D-Cx}Jr} z?T72@@OB;Eq2{!9Evd;A)~QB2PKQz1t-yMcAYDcR`@RnwxZXho&8omVIU5RgKWvP@ z(r^QX9s`*wg|1hC8*8x1*p9u_(a^1gsS`yjFdf$)PnD-A3H%gwLuyWV1uvLP(F#(c zw>$-#Ntd>oT*qB?%AInz4DTYi$Spc-HLgKxW}IgeZmNO0jlwn^-d%;8RpVMdTej?y zHSS`rw&&v9`PKyM??4_1{uPQI8|WpQqg<|ans{xv6J2kPK8|s0za>*@3vO;0uPx^5PZlG+LjPmgw03&0tKlU;11$oP3E4sZ3?^TgS3fa)o8`{7U3@TKCEYHx~_5ufL z@ID>hA4PSzqptVyGA;y_Nvq<3Mpmf=%Ot_eB!TSRkGxTFfmjk3rIYgPj9itejI|Me zv+?BIw~Uo=kTL6!4!K+n4y$A%XFhihqnyYU*Nfmzg2dLzjfRZ2Pr#8n+(kAMOWNRaPK;%!#!k>+*5@QRbhQY_VT@qCzI zR!y=eN9Hp|_T~tp`VoRCT4a=D$!HDoI@los;xIr~vV54K7f?na2Dm#0g{TVSbs#9P z?GzNN@KII3%8IP$k3;E<$Wz&>pccjI1kbhu&vW_a6)J}-j$3h^+lw~lWCB_5i^|DI zg#wcf2pcRL>zR8W4-VWc!eU5WpW?Z}Wf<)N7M&wFqCjN~!WvK=BEjrD)+@`WNrIph z!f|eS(pbwZ7eliUd7imQ22SJz^<&^-#VM}%F{7I)&P|n(=fdvC`SeL+HJj!Kgy~>( z@obgP-fOI5vtD31%_0j%KEcKA6JcK_7T|U!oSouwpA?wQmB(p5_$j2><;SPTH&sRK ztqRmIZS^WltE6;>cwFy{%D2Qxw>VBHoQ+MG5iNS5Vpd#sq&Vh$LKV2bg$U*-3@YaF zv;v=2RbEjcQXaQVctEHqSqzOH5rYam$a&uf5Al88E=O=q>!R@Romh8Ct-TJP!J|X2 z!y{+;LO)C4Q5`;ahIbyDhR1dIJg=pE(F)-U33weTxE952F@$HdcD{)Q5nUL3R!c^Casy$R`Cb*i-;|l>RC0Dn zRB3o#MD+s}m8>P}@I!XG*5L&a*^el^sKZMlvX`gf$2z=1mSQsi4YYzs@=v&x8vK-D z^D|*#mcq|<_=T|W%W3$P4!@qm<~IVH-`3!FI{ZGy<_`uFrI2`8F()9k0)Qw9G*GUxb(Lu^VYpmM!&ErbLyY#Uh)5Ypt1h>)0vHL zyxF+p($m7Sq$GuXzEspy*I}`#xJF@pG1CL2Dps=W4zc7B3-9*_ls>$p%|DULtmh4)zxbds} z{6D0ny3Oohs4ld}k>m@yslKI}%{*AFc@XcSO`82nHJdZISo8d1&Gb^u<{T{6+<@IC zp94!ZoAG1UhK2U%yk?xSQLUq6dpy4}xno|E{cm7x?rpLg5w`Bw9_q0_S`x%LVAG>o NI~VUjEhaBy{|7AOZfO7j literal 0 HcmV?d00001 diff --git a/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/data/pickle_module_info.txt b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/python_env.yaml b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/requirements.txt b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/9ea595f0043a477bb635754b7f77fa48/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/code/train.py b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/code/train.py new file mode 100644 index 0000000..6848e44 --- /dev/null +++ b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/code/train.py @@ -0,0 +1,96 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +import mlflow +from mlflow.models.signature import ModelSignature +from mlflow.types.schema import Schema, ColSpec +from tqdm import tqdm + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(5, 3) + self.fc2 = nn.Linear(3, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=i) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(5), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=10) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('train_fortune_predict_model') + + # start a new MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + + # create a signature to record model input and output + input_schema = Schema([ + ColSpec('float', 'age'), + ColSpec('float', 'mood level'), + ColSpec('float', 'health level'), + ColSpec('float', 'hungry level'), + ColSpec('float', 'sexy level') + ]) + output_schema = Schema([ColSpec('float', 'fortune')]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + + # log trained model + mlflow.pytorch.log_model(model, 'model', signature=signature) + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/MLmodel b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/MLmodel new file mode 100644 index 0000000..85b1864 --- /dev/null +++ b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: d240fe9348c24d1f871506e8d1155f56 +run_id: ab28ca803756454881d83e7e85945df0 +signature: + inputs: '[{"name": "age", "type": "float"}, {"name": "mood level", "type": "float"}, + {"name": "health level", "type": "float"}, {"name": "hungry level", "type": "float"}, + {"name": "sexy level", "type": "float"}]' + outputs: '[{"name": "fortune", "type": "float"}]' +utc_time_created: '2023-02-22 02:26:30.657849' diff --git a/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/conda.yaml b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/data/model.pth b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..017488d9adfd6dee0197964542679b76c8505cf9 GIT binary patch literal 3795 zcmbVP>v!Bn6_<8xCsh+W32j1~kZzhjWRiH-kJu*3y3{T%LCMBd8W1f(XeF&@Sy|e< z8pSqbLrd6oQUZmx&<7z+TH3Vb(ei%UwC0%>3gH7^d-za3aQMVO0C#3&d+nUfIb`$x=WP201=PytD`O*0=AJzDflQ=!vkR{_~bqW_#rAz{;?Vv{c4 z??UI1=Z5iHImo*TBx}%8g;qmB4bv1trU`8Zivb5LW*1h4Mhg2GXJF9jbu#$$_St>T zV7|{9?CBqH`v(iV3;BLnouhD_4ob5q%z_nCMJ(P7T^dr0;)1UyN)^_qq>ZdHR&l>h zfN{ZE;|}bl9Jf&P-ISFIixXwfP5EwAu{?ay$)Hk7aadE(9xu7*7b)s?G+RTAWFhix zS`2&z)~U@!7oZiuuIDaBFpc*k(6FHf@6q7~Rg*Odf3nu1C2iBjX**P0pM5BBqp=%f zpc0jjOYUfu>LOOf#6@E=&^w=vOUV>nx~1^hC5NF)28iuo&ss~m8n5Dg&rMxn<>V0T%bY& zBl}2i6?RvlUnRQ`*EM{>5LsTl!T~;nCDvt{G2sS{4lZT+et@(_YK6G+4^&}~(atAI zlSpJM@+ceMn~RM$jP1*@3LtB9F+f=UVN_x9XPZS3lUW2kM3frbrNaknaJR9E`E1xg z%rMHwdjJd{g^}3DxEJItkFDsQDtt&q7Aa&)Q*USkOE9QV1x9&>7Pc3-w+0{9VSg0W z;UjfD!^^l3R3@#80~%SU5-gJhFOvkacLaH(;sUWG&P&JT`3rJYrZUz>{LRLb3*RzU z!U4vtgF57LH8`Y_t(^JXIgD{4S6nZG`v?+SC)*4eZBN1BI^0jT6HVKQ?iimGnf+R1 zIKs?*RELjsA}tLaK2CPza=3Rrpu>Ztk33j~PgLP3%e_VhI8rRt3-NrCU{+1CH%AsT zMzT4AsD6qdiWV6oqhzcGc^&K!0dW{0Ygse?(D^VFtMF-6 zz{-lO=#N9`l*m)rs-PCd>IBcW1J85$<`pW3Dvn!moqLKl=41j{?~BUGM}-2D4hS18 z8=IMX9}f=PEW%<)U7zB)!DSfj0hXO3IHEx1D1+4c9^X_Iv9~Hv!?e|_ zFr$*vDdKUxQ!3vQC*9&Wp>R4jVMes*g^F2m*^%OyiwRZWktQOTqcEtL$9fd_qN?(W z3X$@-Wx^SuqKsl_^spFI;7gqM8Tc~a=k0O?k7^whzH%SdT~ceU!&mX>kn8Z+X}-|M zDLkRW*G}=y*Jt2K9iHN~lrLH#JWU=U=$4!z!fZD@Lmt(V6u!aD)!?iq*WjDN)Hw>z z>Tq6|x-bLJ>F|6+1oys0fFPA#sKJXmTqJ@vFOjJn5kz>Ih>X8NL~g%LMDo5vL~_1M zL_WU9D*>+~1=pguEr#%_*2*{0AfiiyuW89BPi`SBGvBYm4;nJ_LzSFf5mgWTNJRBx z7L}|e>+lnHy4K;RBC?-R__+?h5Rv_I27aZ(ELn+7FU+A8Jd%ISt<>OkhRqwo!aRlF z=mL8d99#4uZF6cLRyKRCwrHhs(cPoNZSkVtOk{^P?fKVS_MaDrn7xr#p6Xy{H+!yT zZ%?DWp3&j{YXsr!_S$UcV;AS%n0hPA{QvjF8TbG8-+S%;-yYh*;|9N{i(T*7(>(6A z(%o^~$Jn6|_@l$wYYaRlMX$o5zI<-{2)l{0XH1jXYwWN4xLot>a?PHVnvFSFuDJ!f4L*BUYBu7> zt_@4=iABvgV`Exd+s=4?YjW43B>UgM+QQppHzI5sVtc5^{%A=M=YUO*X{}tm4YioO Gko_MD&1tm& literal 0 HcmV?d00001 diff --git a/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/data/pickle_module_info.txt b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/python_env.yaml b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/requirements.txt b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/ab28ca803756454881d83e7e85945df0/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/code/train.py b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/code/train.py new file mode 100644 index 0000000..23336bc --- /dev/null +++ b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/code/train.py @@ -0,0 +1,96 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +import mlflow +from mlflow.models.signature import ModelSignature +from mlflow.types.schema import Schema, ColSpec +from tqdm import tqdm + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(5, 3) + self.fc2 = nn.Linear(3, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=epoch) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-3 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(5), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=10) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('train_fortune_predict_model') + + # start a new MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + + # create a signature to record model input and output + input_schema = Schema([ + ColSpec('float', 'age'), + ColSpec('float', 'mood level'), + ColSpec('float', 'health level'), + ColSpec('float', 'hungry level'), + ColSpec('float', 'sexy level') + ]) + output_schema = Schema([ColSpec('float', 'fortune')]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + + # log trained model + mlflow.pytorch.log_model(model, 'model', signature=signature) + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/MLmodel b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/MLmodel new file mode 100644 index 0000000..0086e38 --- /dev/null +++ b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 2d856775bf3840668e99c8a230c6c663 +run_id: ac13f624d0114ca494441db540b6629c +signature: + inputs: '[{"name": "age", "type": "float"}, {"name": "mood level", "type": "float"}, + {"name": "health level", "type": "float"}, {"name": "hungry level", "type": "float"}, + {"name": "sexy level", "type": "float"}]' + outputs: '[{"name": "fortune", "type": "float"}]' +utc_time_created: '2023-02-22 02:43:17.551796' diff --git a/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/conda.yaml b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/data/model.pth b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..601cc6831f8c48748ecfe2af2dc6f756455fb238 GIT binary patch literal 3795 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 LZ$m96FJ%7*&W3l` literal 0 HcmV?d00001 diff --git a/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/data/pickle_module_info.txt b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/python_env.yaml b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/requirements.txt b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/ac13f624d0114ca494441db540b6629c/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/code/train.py b/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/code/train.py new file mode 100644 index 0000000..1538383 --- /dev/null +++ b/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/code/train.py @@ -0,0 +1,98 @@ +# train.py +# +# author: deng +# date : 20230221 + +import torch +import torch.nn as nn +from torch.optim import SGD +import mlflow +from mlflow.models.signature import ModelSignature +from mlflow.types.schema import Schema, ColSpec +from tqdm import tqdm + + +class Net(nn.Module): + """ define a simple neural network model """ + def __init__(self): + super(Net, self).__init__() + self.fc1 = nn.Linear(5, 3) + self.fc2 = nn.Linear(3, 1) + + def forward(self, x): + x = self.fc1(x) + x = torch.relu(x) + x = self.fc2(x) + return x + + +def train(model, dataloader, criterion, optimizer, epochs): + """ define the training function """ + for epoch in tqdm(range(epochs), 'Epochs'): + + for i, (inputs, labels) in enumerate(dataloader): + + # forwarding + outputs = model(inputs) + loss = criterion(outputs, labels) + + # update gradient + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # log loss + mlflow.log_metric('train_loss', loss.item(), step=epoch) + + return loss + + +if __name__ == '__main__': + + # set hyper parameters + learning_rate = 1e-2 + batch_size = 10 + epochs = 20 + + # create a dataloader with fake data + dataloader = [(torch.randn(5), torch.randn(1)) for _ in range(100)] + dataloader = torch.utils.data.DataLoader(dataloader, batch_size=batch_size) + + # create the model, criterion, and optimizer + model = Net() + criterion = nn.MSELoss() + optimizer = SGD(model.parameters(), lr=learning_rate) + + # set the tracking URI to the model registry + mlflow.set_tracking_uri('http://127.0.0.1:5000') + mlflow.set_experiment('train_fortune_predict_model') + + # start a new MLflow run + with mlflow.start_run(): + + # train the model + loss = train(model, dataloader, criterion, optimizer, epochs) + + # log some additional metrics + mlflow.log_metric('final_loss', loss.item()) + mlflow.log_param('learning_rate', learning_rate) + mlflow.log_param('batch_size', batch_size) + + # create a signature to record model input and output + input_schema = Schema([ + ColSpec('float', 'age'), + ColSpec('float', 'mood level'), + ColSpec('float', 'health level'), + ColSpec('float', 'hungry level'), + ColSpec('float', 'sexy level') + ]) + output_schema = Schema([ColSpec('float', 'fortune')]) + signature = ModelSignature(inputs=input_schema, outputs=output_schema) + + # log trained model + mlflow.pytorch.log_model(model, 'model', signature=signature) + + # log training code + mlflow.log_artifact('./train.py', 'code') + + print('Completed.') \ No newline at end of file diff --git a/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/MLmodel b/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/MLmodel new file mode 100644 index 0000000..e71b91f --- /dev/null +++ b/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: model +flavors: + python_function: + data: data + env: conda.yaml + loader_module: mlflow.pytorch + pickle_module_name: mlflow.pytorch.pickle_module + python_version: 3.10.9 + pytorch: + code: null + model_data: data + pytorch_version: 1.13.1 +mlflow_version: 1.30.0 +model_uuid: 1b7647843b35448d915254eda4751ed8 +run_id: b2961f1b13a84398b7d7ee5be03ab0da +signature: + inputs: '[{"name": "age", "type": "float"}, {"name": "mood level", "type": "float"}, + {"name": "health level", "type": "float"}, {"name": "hungry level", "type": "float"}, + {"name": "sexy level", "type": "float"}]' + outputs: '[{"name": "fortune", "type": "float"}]' +utc_time_created: '2023-02-22 02:46:21.578911' diff --git a/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/conda.yaml b/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/conda.yaml new file mode 100644 index 0000000..758a169 --- /dev/null +++ b/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/conda.yaml @@ -0,0 +1,11 @@ +channels: +- conda-forge +dependencies: +- python=3.10.9 +- pip<=23.0.1 +- pip: + - mlflow + - cloudpickle==2.2.1 + - torch==1.13.1 + - tqdm==4.64.1 +name: mlflow-env diff --git a/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/data/model.pth b/artifacts/3/b2961f1b13a84398b7d7ee5be03ab0da/artifacts/model/data/model.pth new file mode 100644 index 0000000000000000000000000000000000000000..688a91dc08b274d570d4d581c406d978fb0d7d4d GIT binary patch literal 3795 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 literal 0 HcmV?d00001 diff --git a/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/data/pickle_module_info.txt b/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/data/pickle_module_info.txt new file mode 100644 index 0000000..31b9e7e --- /dev/null +++ b/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/data/pickle_module_info.txt @@ -0,0 +1 @@ +mlflow.pytorch.pickle_module \ No newline at end of file diff --git a/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/python_env.yaml b/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/python_env.yaml new file mode 100644 index 0000000..8080c14 --- /dev/null +++ b/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.10.9 +build_dependencies: +- pip==23.0.1 +- setuptools==67.3.2 +- wheel==0.38.4 +dependencies: +- -r requirements.txt diff --git a/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/requirements.txt b/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/requirements.txt new file mode 100644 index 0000000..f5c794c --- /dev/null +++ b/artifacts/3/e8b7a070f5ff48c69c5b945d1fe2f392/artifacts/model/requirements.txt @@ -0,0 +1,4 @@ +mlflow +cloudpickle==2.2.1 +torch==1.13.1 +tqdm==4.64.1 \ No newline at end of file diff --git a/mlflow.db b/mlflow.db index 91119ac1885be75f7c5eb457c0443d1455e54132..ea1bef1d3c4e0eefe35540105490273decaabb48 100644 GIT binary patch literal 974848 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 R33>tyxPhumqNLBs{{b!poE`uG