# TorchTrain fails if train\_func imports functions from a different file

**URL:** <https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409>\
**Category:** Uncategorized\
**Created:** [November 23, 2022, 7:19am UTC](https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409 "2022-11-23T07:19:55Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![indrajitsg](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/indrajitsg/32/3473_2.png) [@indrajitsg](https://discuss.ray.io/u/indrajitsg)\
**Post date:** [November 23, 2022, 7:19am UTC](https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409/1 "2022-11-23T07:19:55Z")

</div>

I am trying to perform Ray training on cluster based on the sample scripts from documentation. I am facing an error: if any of the functions are imported from other modules the code fails. Below are two very simplified versions to reproduce the issue - the first one works where there is no import but the second one fails:

**Works:**

```auto
import ray
from ray.air import session, ScalingConfig
from ray.train.torch import TorchTrainer
import logging

ray.init(address='ray://xxx.xxx.xxx.xxx:10001')

def sample_func(x):
    return x + 10

def train_func(config):
    for i in range(config["num_epochs"]):
        session.report({"epoch": i,
                        "val": sample_func(i)
                       })

config = {'num_epochs': 3}

trainer = TorchTrainer(
    train_func,
    train_loop_config=config,
    scaling_config=ScalingConfig(num_workers=2, use_gpu=False)
)
result = trainer.fit()

```

**Does not work:**

```auto
import ray
from ray.air import session, ScalingConfig
from ray.train.torch import TorchTrainer
import logging
from utils import sample_func

ray.init(address='ray://xxx.xxx.xxx.xxx:10001')

def train_func(config):
    for i in range(config["num_epochs"]):
        session.report({"epoch": i,
                        "val": sample_func(i)
                       })

config = {'num_epochs': 3}

trainer = TorchTrainer(
    train_func,
    train_loop_config=config,
    scaling_config=ScalingConfig(num_workers=2, use_gpu=False)
)
result = trainer.fit()

```

I get a

```auto
ModuleNotFoundError: No module named 'utils'

```

in the second example. Can someone explain how to avoid this issue when launching cluster jobs? I am using Ray 2.1 and the scripts are executed from a Jupyterlab notebook.

Thanks in advance.

---

<div class="post-metadata">

**Author:** ![Yard1](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/yard1/32/508_2.png) [@Yard1](https://discuss.ray.io/u/Yard1)\
**Post date:** [November 29, 2022, 6:24pm UTC](https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409/2 "2022-11-29T18:24:24Z")

</div>

You’d need to create an installable package and install it on every node in your cluster or include it in a Ray runtime environment.

---

<div class="post-metadata">

**Author:** ![Asad\_Hasan](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/asad_hasan/32/3482_2.png) [@Asad\_Hasan](https://discuss.ray.io/u/Asad_Hasan)\
**Post date:** [November 29, 2022, 7:25pm UTC](https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409/3 "2022-11-29T19:25:42Z")

</div>

Thanks @Yard1 - would copying the modules and setting PYTHONPATH correctly on each worker node also work?

---

<div class="post-metadata">

**Author:** ![Yard1](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/yard1/32/508_2.png) [@Yard1](https://discuss.ray.io/u/Yard1)\
**Post date:** [November 29, 2022, 7:42pm UTC](https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409/4 "2022-11-29T19:42:55Z")

</div>

Hey @Asad_Hasan, that should work, yes. You can use Ray runtime environments ([Environment Dependencies — Ray 2.1.0](https://docs.ray.io/en/latest/ray-core/handling-dependencies.html)) to make sure the env var is set correctly across the cluster.

---

<div class="post-metadata">

**Author:** ![Asad\_Hasan](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/asad_hasan/32/3482_2.png) [@Asad\_Hasan](https://discuss.ray.io/u/Asad_Hasan)\
**Post date:** [November 29, 2022, 8:00pm UTC](https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409/5 "2022-11-29T20:00:28Z")

</div>

Thanks for the quick clarification!

---

<div class="post-metadata">

**Author:** ![Yard1](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/yard1/32/508_2.png) [@Yard1](https://discuss.ray.io/u/Yard1)\
**Post date:** [November 29, 2022, 8:03pm UTC](https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409/6 "2022-11-29T20:03:21Z")

</div>

Let us know how that goes!

---

<div class="post-metadata">

**Author:** ![indrajitsg](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/indrajitsg/32/3473_2.png) [@indrajitsg](https://discuss.ray.io/u/indrajitsg)\
**Post date:** [November 30, 2022, 3:13pm UTC](https://discuss.ray.io/t/torchtrain-fails-if-train-func-imports-functions-from-a-different-file/8409/7 "2022-11-30T15:13:31Z")

</div>

Thanks a lot @Yard1 - I was able reach similar solution to what you had mentioned - copying files and folders to each of the nodes and setting PYTHONPATH correctly.
