{"id":5646259,"date":"2022-07-19T10:15:13","date_gmt":"2022-07-19T14:15:13","guid":{"rendered":"https:\/\/lightning.ai\/pages\/?p=5646259"},"modified":"2022-07-28T14:26:58","modified_gmt":"2022-07-28T18:26:58","slug":"build-a-gan-lightning-app","status":"publish","type":"post","link":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/","title":{"rendered":"Building a GAN (Generative Adversarial Network)"},"content":{"rendered":"<h2>Train And Explore Generative Adversarial Networks (GANs) Interactively With Lightning Apps<\/h2>\n<p><span style=\"font-weight: 400;\">In this article, we will build a simple Lightning App to create a GAN (generative adversarial network). We will train it with PyTorch Lightning and make a simple dashboard with <\/span><a href=\"https:\/\/gradio.app\/\"><span style=\"font-weight: 400;\"><u>Gradio<\/u><\/span><\/a><span style=\"font-weight: 400;\">, using the beautiful and seamless integration provided by the Lightning framework.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To start, we need to install Lightning, but first, I will create and activate a new Python 3.8 environment for my new app. Check out <\/span><a href=\"https:\/\/www.youtube.com\/watch?v=WHWsABk4Ejk\"><span style=\"font-weight: 400;\"><u>this Lightning Bits episode<\/u><\/span><\/a><span style=\"font-weight: 400;\"> to learn more about why this is important. To manage Python environments, I use <\/span><a href=\"https:\/\/docs.conda.io\/projects\/conda\/en\/latest\/user-guide\/install\/index.html\"><span style=\"font-weight: 400;\"><u>conda<\/u><\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<pre>$ conda create -n lit-gan python=3.8\r\n\r\n$ conda activate lit-gan\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">While my conda environment is being created, let\u2019s review what we know about GANs.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A Generative Adversarial Network is a machine learning (ML) model in which two neural networks compete with each other to become more accurate in their predictions. When implementing GANs, we need two networks: generator and discriminator. Generator is a neural network tasked with creating something out of random noise (also called seed). Discriminator is a neural network that will learn to differentiate between real and generated output. The two networks are being trained alongside each other, with discriminator\u2019s output being used to train the generator to generate more realistic data and generator\u2019s output being used to train discriminator to detect fakes better. In this possibly endless competition, generator has the opportunity to improve infinitely. Ultimately, we get a neural network that can generate very trustworthy data samples. It\u2019s no surprise that GANs took the world by storm and continues to impress researchers.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">If you followed me and created a new Python environment, you should already have it configured by now. The next step is to install Lightning:<\/span><\/p>\n<pre>$ pip install lightning\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">We are going to start with the Lightning App quick start template. To install it, execute:<\/span><\/p>\n<pre>$ lightning install app lightning\/quick-start\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">It will create a new project directory called <code>lightning-quick-start<\/code> for you. Open it in the editor of your choice. I will use VS Code for this walkthrough, but if you have questions about why or which editor to use, check out <\/span><a href=\"https:\/\/www.youtube.com\/watch?v=ISGNh4B1Z74\"><u>this Lightning Bits episode on IDEs<\/u><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5646274\" src=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start.png\" alt=\"Lightning Quick Start\" width=\"3296\" height=\"2094\" srcset=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start.png 3296w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start-300x191.png 300w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start-1024x651.png 1024w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start-768x488.png 768w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start-1536x976.png 1536w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start-2048x1301.png 2048w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start-1920x1220.png 1920w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-quick-start-600x381.png 600w\" sizes=\"(max-width: 3296px) 100vw, 3296px\" \/>Before we continue, let\u2019s open <\/span><a href=\"https:\/\/pytorch-lightning.readthedocs.io\/en\/stable\/notebooks\/lightning_examples\/basic-gan.html\"><u>the PyTorch Lightning tutorial on GANs<\/u><\/a><span style=\"font-weight: 400;\">. We will borrow a lot of source code from here to get our app working even faster. In this example, we will train our GAN to generate digits for the MNIST dataset.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We also need to make sure to install the dependencies we are going to use. It\u2019s easy to do if you replace the contents of the project\u2019s <code>requirements.txt<\/code> file with the following:<\/span><\/p>\n<pre>torchvision\r\npytorch-lightning==1.6.3\r\njsonargparse[signatures]==4.7.3\r\nwandb==0.12.16\r\ngradio==2.9.4\r\npyyaml==5.4.0\r\nprotobuf&lt;4.21.0 # 4.21 breaks with wandb, tensorboard, or pytorch-lightning: https:\/\/github.com\/protocolbuffers\/protobuf\/issues\/10048 torchmetrics&gt;=0.3\r\ntorch&gt;=1.6, &lt;1.9\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">And run <\/span><code>pip install -r requirements.txt<\/code><span style=\"font-weight: 400;\"> from the terminal.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Next, find the file named <code>train_script.py<\/code> in your IDE and replace its content with the code from the PyTorch Lightning tutorial linked above, but don\u2019t copy the first line containing the <\/span><code>pip install<\/code><span style=\"font-weight: 400;\"> command. We don\u2019t need it because we already installed our dependencies. However, we are going to make some modifications to it.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">First, add the line saying <\/span><code>from pytorch_lightning.utilities.cli import LightningCLI<\/code><span style=\"font-weight: 400;\"> to the top of the file to import the Lightning CLI. This isn\u2019t required, but it\u2019s nice to have our training script modernized to use <\/span><a href=\"https:\/\/devblog.pytorchlightning.ai\/introducing-lightningcli-v2-supercharge-your-training-c070d43c7dd6\"><u>Lightning CLI because it significantly improves the quality of the development process<\/u><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Next, find the <\/span><span style=\"font-weight: 400;\">GAN<\/span><span style=\"font-weight: 400;\"> class definition and make sure that the <\/span><code>__init__<\/code><span style=\"font-weight: 400;\"> method declaration looks like this:<\/span><\/p>\n<pre>class GAN(LightningModule):\r\n    def __init__(\r\n        self,\r\n        channels: int = 1,\r\n        width: int = 28,\r\n        height: int = 28,\r\n        latent_dim: int = 100,\r\n        lr: float = 0.0002,\r\n        b1: float = 0.5,\r\n        b2: float = 0.999,\r\n        batch_size: int = BATCH_SIZE,\r\n        **kwargs\r\n    ):\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">And last, but not least, replace:<\/span><\/p>\n<pre>dm = MNISTDataModule()\r\nmodel = GAN(*dm.size())\r\ntrainer = Trainer(\r\n    accelerator=\"auto\",\r\n    devices=1 if torch.cuda.is_available() else None,  # limiting got iPython runs\r\n    max_epochs=5,\r\n    callbacks=[TQDMProgressBar(refresh_rate=20)],\r\n)\r\ntrainer.fit(model, dm)\r\n\r\n# Start tensorboard.\r\n%load_ext tensorboard\r\n%tensorboard --logdir lightning_logs\/\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">With:<\/span><\/p>\n<pre>if __name__ == \"__main__\":\r\n    cli = LightningCLI(\r\n        GAN, MNISTDataModule, seed_everything_default=42, save_config_overwrite=True, run=False\r\n    )\r\n    cli.trainer.fit(cli.model, datamodule=cli.datamodule)\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Now, we will make some changes to the Lightning App itself. Open the file <code>app.py<\/code>. Our quick start Lightning App consists of two works \u2014 train work and serve work \u2014 and a Lightning Flow to orchestrate them.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5646275\" src=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/terminal-in-lightning-apps.png\" alt=\"Lightning Flow\" width=\"1418\" height=\"380\" srcset=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/terminal-in-lightning-apps.png 1418w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/terminal-in-lightning-apps-300x80.png 300w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/terminal-in-lightning-apps-1024x274.png 1024w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/terminal-in-lightning-apps-768x206.png 768w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/terminal-in-lightning-apps-600x161.png 600w\" sizes=\"(max-width: 1418px) 100vw, 1418px\" \/>This is exactly what we need for our app, so we will leave the <code>app.py<\/code> file as-is, but you may want to increase the number of training epochs to get nicer results.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">What we will need to modify are the train and serve works. Open the file <code>quick_start\/components.py<\/code> and find the class <\/span><code>PyTorchLightningScript<\/code><span style=\"font-weight: 400;\">. The method we are going to focus on is <\/span><code>run<\/code><span style=\"font-weight: 400;\">. Remove the following lines from it:<\/span><\/p>\n<pre>download_data(\"https:\/\/pl-flash-data.s3.amazonaws.com\/assets_lightning\/demo_weights.pt\", \".\/\")\r\n\"--trainer.limit_train_batches=4\",\r\n\"--trainer.limit_val_batches=4\",\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">We will not use pre-trained weights for our GAN and we don\u2019t want to limit the number of batches.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Also, replace:<\/span><\/p>\n<pre>\"--trainer.callbacks.monitor=val_acc\",\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">With:<\/span><\/p>\n<pre>\"--<span style=\"font-weight: 400;\">trainer.callbacks.save_last=true<\/span>\",\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">This makes Lightning always save our model at the end of training.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Next, find the line that says <\/span><code>checkpoint = torch.load(res[\"cli\"].trainer.checkpoint_callback.best_model_path)<\/code><span style=\"font-weight: 400;\"> inside of the <\/span><code>on_after_run<\/code><span style=\"font-weight: 400;\"> method and replace <\/span><code>best_model_path<\/code><span style=\"font-weight: 400;\"> in it with <\/span><code>last_model_path<\/code><span style=\"font-weight: 400;\">. This will make sure that we are exposing our model to the serve work after training.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">That\u2019s it. We are done with our training work. When we run the app, the training work will train the model, save the weights, and expose the path to the weights as the <\/span><code>best_model_path<\/code><span style=\"font-weight: 400;\"> property. Now, we will replace the <\/span><code>ImageServeGradio<\/code><span style=\"font-weight: 400;\"> class with the following code:<\/span><\/p>\n<pre>class ImageServeGradio(ServeGradio):\r\n\r\n    inputs = [\r\n        gr.inputs.Slider(0, 1000, label=\"Seed\", default=42),\r\n        gr.inputs.Slider(4, 64, label=\"Number of Digits\", step=1, default=10),\r\n    ]\r\n    outputs = \"image\"\r\n    examples = [[27, 5], [18, 4], [256, 8], [1337, 35]]\r\n\r\n    def __init__(self, cloud_compute, *args, **kwargs):\r\n        super().__init__(*args, cloud_compute=cloud_compute, **kwargs)\r\n        self.model_path = None\r\n\r\n    def run(self, model_path):\r\n        self.model_path = model_path\r\n        super().run()\r\n\r\n    def predict(self, seed, num_digits):\r\n        torch.manual_seed(seed)\r\n        z = torch.randn(num_digits, 100)\r\n        digits = self.model(z)\r\n        save_image(digits, \"digits.png\", normalize=True)\r\n        return \"digits.png\"\r\n\r\n    def build_model(self):\r\n        model = torch.load(self.model_path)\r\n        for p in model.parameters():\r\n            p.requires_grad = False\r\n        model.eval()\r\n        return model\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">And don\u2019t forget to add <\/span><code>from torchvision.utils import save_image<\/code><span style=\"font-weight: 400;\"> at the top of the file.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This <\/span><code>ImageServeGradio<\/code><span style=\"font-weight: 400;\"> class extends on Lightning ServeGradio, creating two inputs (sliders to control the random seed and the number of digits that our GAN will generate),one output (an image), and a list of examples. This class also defines the <\/span><code>run<\/code><span style=\"font-weight: 400;\"> and <\/span><code>build_model<\/code><span style=\"font-weight: 400;\"> methods used to load the model and the <\/span><code>predict<\/code><span style=\"font-weight: 400;\"> method, which runs inference on our model.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Now, we can run our new GAN Lightning App:<\/span><\/p>\n<pre>lightning run app app.py\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">The app will launch and open a new page in the browser, where you can see two tabs. The first <strong>Model Training<\/strong> tab contains TensorBoard, where you can explore any logs and metrics that your <code>train_script.py<\/code> is logging (feel free to add more TensorBoard logs there \ud83d\ude09 ), and the second <strong>Interactive Demo<\/strong> tab will show you a loading spinner until the training is complete. That\u2019s ok; you can monitor the training progress either in TensorBoard or in the terminal logs.<\/span><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5646278 size-full\" src=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard.png\" alt=\"TensorBoard in Lightning Apps\" width=\"3296\" height=\"2094\" srcset=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard.png 3296w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard-300x191.png 300w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard-1024x651.png 1024w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard-768x488.png 768w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard-1536x976.png 1536w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard-2048x1301.png 2048w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard-1920x1220.png 1920w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-tensorboard-600x381.png 600w\" sizes=\"(max-width: 3296px) 100vw, 3296px\" \/><em>TensorBoard tab<\/em><\/span><\/p>\n<p style=\"text-align: center;\"><i><span style=\"font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5646276\" src=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning.png\" alt=\"Interactive Demo tab in Lightning AI\" width=\"3296\" height=\"2094\" srcset=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning.png 3296w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning-300x191.png 300w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning-1024x651.png 1024w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning-768x488.png 768w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning-1536x976.png 1536w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning-2048x1301.png 2048w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning-1920x1220.png 1920w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-loading-in-lightning-600x381.png 600w\" sizes=\"(max-width: 3296px) 100vw, 3296px\" \/>\u201cLoading\u201d Interactive Demo tab<\/span><\/i><\/p>\n<p style=\"text-align: center;\"><i><span style=\"font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5646277 size-full\" src=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1.png\" alt=\"Lightning Terminal Logs\" width=\"3068\" height=\"1110\" srcset=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1.png 3068w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1-300x109.png 300w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1-1024x370.png 1024w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1-768x278.png 768w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1-1536x556.png 1536w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1-2048x741.png 2048w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1-1920x695.png 1920w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/lightning-terminal-logs-1-600x217.png 600w\" sizes=\"(max-width: 3068px) 100vw, 3068px\" \/>Logs in the terminal<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\">Once the app is trained, the Interactive Demo tab will load, and you\u2019ll be able to generate some MNIST numbers here.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5646279 size-full\" src=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning.png\" alt=\"Interactive Demo tab loaded in Lightning\" width=\"3296\" height=\"2094\" srcset=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning.png 3296w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning-300x191.png 300w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning-1024x651.png 1024w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning-768x488.png 768w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning-1536x976.png 1536w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning-2048x1301.png 2048w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning-1920x1220.png 1920w, https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/interactive-demo-in-lightning-600x381.png 600w\" sizes=\"(max-width: 3296px) 100vw, 3296px\" \/>Play around with the seed and the number of digits to see different results. You can also tune hyperparameters and the models in <code>train_script.py<\/code> to improve the results.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">If you followed this article, you now have a running GAN Lightning App. It is impressive how easily you can build a functional and interactive Lightning App with a custom UI, but it\u2019s only the beginning. I am sure you can create so much more with Lightning, and I can\u2019t wait to see what you build! <\/span><a href=\"https:\/\/join.slack.com\/t\/pytorch-lightning\/shared_invite\/zt-1bqiy6kpt-x~2PBicDp~z_rF8r8l3vcg\" target=\"_blank\" rel=\"noopener\"><u>Join our Lightning community<\/u><\/a><span style=\"font-weight: 400;\"> to see what others are building and share what you\u2019ve built.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">If you have more questions, check out <\/span><a href=\"https:\/\/github.com\/PyTorchLightning\/lightning-gan\"><u>the GAN app&#8217;s source code<\/u><\/a><span style=\"font-weight: 400;\">, or read <\/span><a href=\"https:\/\/lightning.ai\/lightning-docs\"><u>the Lightning documentation<\/u><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">PS: you can also <\/span><a href=\"https:\/\/lightning.ai\/lightning-docs\/\"><u>run your app in the cloud<\/u><\/a><span style=\"font-weight: 400;\"> without changing a line of your code! Just add <\/span><code>--cloud<\/code><span style=\"font-weight: 400;\"> to your <\/span><code>run<\/code><span style=\"font-weight: 400;\"> command:<\/span><\/p>\n<pre>lightning run app app.py \u2013cloud\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Keep building with Lightning!<\/span><\/p>\n<p><i><span style=\"font-weight: 400;\">By Yurij Mikhalevich, Senior Software Engineer Lightning AI<\/span><\/i><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Train And Explore Generative Adversarial Networks (GANs) Interactively With Lightning Apps In this article, we will build a simple Lightning App to create a GAN (generative adversarial network). We will train it with PyTorch Lightning and make a simple dashboard with Gradio, using the beautiful and seamless integration provided by the Lightning framework. To start,<a class=\"excerpt-read-more\" href=\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/\" title=\"ReadBuilding a GAN (Generative Adversarial Network)\">&#8230; Read more &raquo;<\/a><\/p>\n","protected":false},"author":16,"featured_media":5646359,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[41],"tags":[55,45],"glossary":[],"acf":{"hide_from_archive":null,"content_type":null,"code_embed":null,"code_shortcode":null,"custom_styles":null,"sticky":null,"additional_authors":null,"mathjax":null,"default_editor":null,"sections":null,"show_table_of_contents":null,"table_of_contents":null,"tabs":null,"tab_group":null},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building a GAN (Generative Adversarial Network) - Lightning AI<\/title>\n<meta name=\"description\" content=\"Want to build an interactive GAN Lightning App? Follow along in this Lightning tutorial to find out how easy it is to get up and running.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a GAN (Generative Adversarial Network) - Lightning AI\" \/>\n<meta property=\"og:description\" content=\"Want to build an interactive GAN Lightning App? Follow along in this Lightning tutorial to find out how easy it is to get up and running.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/\" \/>\n<meta property=\"og:site_name\" content=\"Lightning AI\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-19T14:15:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-28T18:26:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/twitter-posts.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"900\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"JP Hennessy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/twitter-posts.png\" \/>\n<meta name=\"twitter:creator\" content=\"@LightningAI\" \/>\n<meta name=\"twitter:site\" content=\"@LightningAI\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"JP Hennessy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/\"},\"author\":{\"name\":\"JP Hennessy\",\"@id\":\"https:\/\/lightning.ai\/pages\/#\/schema\/person\/2518f4d5541f8e98016f6289169141a6\"},\"headline\":\"Building a GAN (Generative Adversarial Network)\",\"datePublished\":\"2022-07-19T14:15:13+00:00\",\"dateModified\":\"2022-07-28T18:26:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/\"},\"wordCount\":1103,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/lightning.ai\/pages\/#organization\"},\"image\":{\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/Build-a-GAN-in-Lightning.png\",\"keywords\":[\"GAN\",\"lightning apps\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/\",\"url\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/\",\"name\":\"Building a GAN (Generative Adversarial Network) - Lightning AI\",\"isPartOf\":{\"@id\":\"https:\/\/lightning.ai\/pages\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/Build-a-GAN-in-Lightning.png\",\"datePublished\":\"2022-07-19T14:15:13+00:00\",\"dateModified\":\"2022-07-28T18:26:58+00:00\",\"description\":\"Want to build an interactive GAN Lightning App? Follow along in this Lightning tutorial to find out how easy it is to get up and running.\",\"breadcrumb\":{\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#primaryimage\",\"url\":\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/Build-a-GAN-in-Lightning.png\",\"contentUrl\":\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/Build-a-GAN-in-Lightning.png\",\"width\":2560,\"height\":1280,\"caption\":\"Build a GAN in Lightning\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/lightning.ai\/pages\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a GAN (Generative Adversarial Network)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/lightning.ai\/pages\/#website\",\"url\":\"https:\/\/lightning.ai\/pages\/\",\"name\":\"Lightning AI\",\"description\":\"The platform for teams to build AI.\",\"publisher\":{\"@id\":\"https:\/\/lightning.ai\/pages\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/lightning.ai\/pages\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/lightning.ai\/pages\/#organization\",\"name\":\"Lightning AI\",\"url\":\"https:\/\/lightning.ai\/pages\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/lightning.ai\/pages\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2023\/02\/image-17.png\",\"contentUrl\":\"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2023\/02\/image-17.png\",\"width\":1744,\"height\":856,\"caption\":\"Lightning AI\"},\"image\":{\"@id\":\"https:\/\/lightning.ai\/pages\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/LightningAI\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/lightning.ai\/pages\/#\/schema\/person\/2518f4d5541f8e98016f6289169141a6\",\"name\":\"JP Hennessy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/lightning.ai\/pages\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/28ade268218ae45f723b0b62499f527a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/28ade268218ae45f723b0b62499f527a?s=96&d=mm&r=g\",\"caption\":\"JP Hennessy\"},\"url\":\"https:\/\/lightning.ai\/pages\/author\/jplightning-ai\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a GAN (Generative Adversarial Network) - Lightning AI","description":"Want to build an interactive GAN Lightning App? Follow along in this Lightning tutorial to find out how easy it is to get up and running.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/","og_locale":"en_US","og_type":"article","og_title":"Building a GAN (Generative Adversarial Network) - Lightning AI","og_description":"Want to build an interactive GAN Lightning App? Follow along in this Lightning tutorial to find out how easy it is to get up and running.","og_url":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/","og_site_name":"Lightning AI","article_published_time":"2022-07-19T14:15:13+00:00","article_modified_time":"2022-07-28T18:26:58+00:00","og_image":[{"width":1600,"height":900,"url":"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/twitter-posts.png","type":"image\/png"}],"author":"JP Hennessy","twitter_card":"summary_large_image","twitter_image":"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/twitter-posts.png","twitter_creator":"@LightningAI","twitter_site":"@LightningAI","twitter_misc":{"Written by":"JP Hennessy","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#article","isPartOf":{"@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/"},"author":{"name":"JP Hennessy","@id":"https:\/\/lightning.ai\/pages\/#\/schema\/person\/2518f4d5541f8e98016f6289169141a6"},"headline":"Building a GAN (Generative Adversarial Network)","datePublished":"2022-07-19T14:15:13+00:00","dateModified":"2022-07-28T18:26:58+00:00","mainEntityOfPage":{"@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/"},"wordCount":1103,"commentCount":0,"publisher":{"@id":"https:\/\/lightning.ai\/pages\/#organization"},"image":{"@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#primaryimage"},"thumbnailUrl":"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/Build-a-GAN-in-Lightning.png","keywords":["GAN","lightning apps"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/","url":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/","name":"Building a GAN (Generative Adversarial Network) - Lightning AI","isPartOf":{"@id":"https:\/\/lightning.ai\/pages\/#website"},"primaryImageOfPage":{"@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#primaryimage"},"image":{"@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#primaryimage"},"thumbnailUrl":"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/Build-a-GAN-in-Lightning.png","datePublished":"2022-07-19T14:15:13+00:00","dateModified":"2022-07-28T18:26:58+00:00","description":"Want to build an interactive GAN Lightning App? Follow along in this Lightning tutorial to find out how easy it is to get up and running.","breadcrumb":{"@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#primaryimage","url":"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/Build-a-GAN-in-Lightning.png","contentUrl":"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2022\/07\/Build-a-GAN-in-Lightning.png","width":2560,"height":1280,"caption":"Build a GAN in Lightning"},{"@type":"BreadcrumbList","@id":"https:\/\/lightning.ai\/pages\/community\/tutorial\/build-a-gan-lightning-app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/lightning.ai\/pages\/"},{"@type":"ListItem","position":2,"name":"Building a GAN (Generative Adversarial Network)"}]},{"@type":"WebSite","@id":"https:\/\/lightning.ai\/pages\/#website","url":"https:\/\/lightning.ai\/pages\/","name":"Lightning AI","description":"The platform for teams to build AI.","publisher":{"@id":"https:\/\/lightning.ai\/pages\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/lightning.ai\/pages\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/lightning.ai\/pages\/#organization","name":"Lightning AI","url":"https:\/\/lightning.ai\/pages\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lightning.ai\/pages\/#\/schema\/logo\/image\/","url":"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2023\/02\/image-17.png","contentUrl":"https:\/\/lightningaidev.wpengine.com\/wp-content\/uploads\/2023\/02\/image-17.png","width":1744,"height":856,"caption":"Lightning AI"},"image":{"@id":"https:\/\/lightning.ai\/pages\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/LightningAI"]},{"@type":"Person","@id":"https:\/\/lightning.ai\/pages\/#\/schema\/person\/2518f4d5541f8e98016f6289169141a6","name":"JP Hennessy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lightning.ai\/pages\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/28ade268218ae45f723b0b62499f527a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/28ade268218ae45f723b0b62499f527a?s=96&d=mm&r=g","caption":"JP Hennessy"},"url":"https:\/\/lightning.ai\/pages\/author\/jplightning-ai\/"}]}},"_links":{"self":[{"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/posts\/5646259"}],"collection":[{"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/comments?post=5646259"}],"version-history":[{"count":0,"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/posts\/5646259\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/media\/5646359"}],"wp:attachment":[{"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/media?parent=5646259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/categories?post=5646259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/tags?post=5646259"},{"taxonomy":"glossary","embeddable":true,"href":"https:\/\/lightning.ai\/pages\/wp-json\/wp\/v2\/glossary?post=5646259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}