internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: obspy/obspy

Issue:
Inventory projection "local" plot broken
### Avoid duplicates

- [X] I searched existing issues

### Bug Summary

Seems like #3018 broke Inventory plotting when a non-default projection like "local" is specified..

### Code to Reproduce

```python
inv = read_inventory()
inv.plot(projection='local')
```


### Error Traceback

_No response_

### ObsPy Version?

1.3.1

### Operating System?

_No response_

### Python Version?

_No response_

### Installation Method?

_No response_


Discussion:
Catalog plotting with a local projection also breaks in obspy 1.3.1:
```python
from obspy import read_events
cat = read_events()
cat.plot(projection="local")
```

Resolving patch:
diff --git a/obspy/imaging/maps.py b/obspy/imaging/maps.py
--- a/obspy/imaging/maps.py
+++ b/obspy/imaging/maps.py
@@ -269,12 +269,13 @@ def plot_cartopy(lons, lats, size, color, labels=None, projection='global',
 
     if ax is None:
         fig, map_ax, cm_ax, show_colorbar = _basic_setup(
-            lons=lons, lats=lats, size=size, color=color, labels=None,
-            projection='global', resolution='110m', continent_fill_color='0.8',
-            water_fill_color='1.0', colormap=None, colorbar=None, marker="o",
-            title=None, colorbar_ticklabel_format=None,
-            proj_kwargs=None)
-
+            lons=lons, lats=lats, size=size, color=color, labels=labels,
+            projection=projection, resolution=resolution,
+            continent_fill_color=continent_fill_color,
+            water_fill_color=water_fill_color, colormap=colormap,
+            colorbar=colorbar, marker=marker, title=title,
+            colorbar_ticklabel_format=colorbar_ticklabel_format,
+            proj_kwargs=proj_kwargs)
     else:
         if isinstance(ax, matplotlib.figure.Figure):
             fig = ax


Test patch:
Repository: obspy/obspy

Issue:
Raising FDSNTooManyRequestsException in error handling typo
Hello,
according to this code, present also in the current version (1.3.1):

https://github.com/obspy/obspy/blob/0d77efd744c8aa6fc8bb9ac2fe367cbc86b1656b/obspy/clients/fdsn/client.py#L1836-L1838

the first argument of the mentioned exception appears to be a tuple. This causes a TypeError when effectively too many requests are done and the FDSNTooManyRequestsException raises:

```
TypeError: sequence item 0: expected str instance, tuple found
```
It seems to be a small typo since the other exceptions have simple strings as first argument.


Discussion:
> It seems to be a small typo since the other exceptions have simple strings as first argument.

yep seems like a copy-paste problem. Thanks!

Resolving patch:
diff --git a/obspy/clients/fdsn/client.py b/obspy/clients/fdsn/client.py
--- a/obspy/clients/fdsn/client.py
+++ b/obspy/clients/fdsn/client.py
@@ -1834,7 +1834,7 @@ def raise_on_error(code, data):
         raise NotImplementedError(msg)
     elif code == 429:
         msg = ("Sent too many requests in a given amount of time ('rate "
-               "limiting'). Wait before making a new request.", server_info)
+               "limiting'). Wait before making a new request.")
         raise FDSNTooManyRequestsException(msg, server_info)
     elif code == 500:
         raise FDSNInternalServerException("Service responds: Internal server "


Test patch:
Repository: obspy/obspy

Issue:
preserve URL on error for FDSN web service requests
### Problem

Often I receive something like this from the FDSN Client:
```
FDSNBadRequestException: Bad request. If you think your request was valid please contact the developers.
HTTP Status code: 400
Detailed response of server:

```
which lets me know my request was bad. But because the server provides no details and the original request URL is not part of the FDSNBadRequestException, it is pretty hard to debug. If the URL were retained and printed as part of the exception, I would at least be able to paste it into a web browser and try various changes to determine why it is failing, then update my script. 

### Proposed solution

Might be better ways to do this, but I think passing optional url parameter to `raise_on_error()` in clients/fdsn/client.py and also adding an url field to FDSNException would be easy way to preserve the request url.

This probably would not fix cases where POST was used, but would at least help for the more common GET style requests.



Discussion:

Resolving patch:
diff --git a/obspy/clients/fdsn/client.py b/obspy/clients/fdsn/client.py
--- a/obspy/clients/fdsn/client.py
+++ b/obspy/clients/fdsn/client.py
@@ -1799,12 +1799,7 @@ def raise_on_error(code, data):
     """
     # get detailed server response message
     if code != 200:
-        try:
-            server_info = data.read()
-        except Exception:
-            server_info = None
-        else:
-            server_info = server_info.decode('ASCII', errors='ignore')
+        server_info = data.decode('ASCII', errors='ignore')
         if server_info:
             server_info = "\n".join(
                 line for line in server_info.splitlines() if line)
@@ -1890,14 +1885,12 @@ def download_url(url, opener, timeout=10, headers={}, debug=False,
         url_obj = opener.open(request, timeout=timeout, data=data)
     # Catch HTTP errors.
     except urllib_request.HTTPError as e:
+        error_data = e.read()
         if debug is True:
             msg = "HTTP error %i, reason %s, while downloading '%s': %s" % \
-                  (e.code, str(e.reason), url, e.read())
+                  (e.code, str(e.reason), url, error_data)
             print(msg)
-        else:
-            # Without this line we will get unclosed sockets
-            e.read()
-        return e.code, e
+        return e.code, error_data
     except Exception as e:
         if debug is True:
             print("Error while downloading: %s" % url)


Test patch:
Repository: obspy/obspy

Issue:
xseed Parser: Misleading error message when trying to read non existent filename path
I've noticed whilst using the Parser function with .dlseed file type that the error 'First byte of data must be in [0-9<]' occurs when an incorrect directory name is entered. This can make it hard to identify whether your file type is corrupt, or that you've entered a wrong directory name

I'd like to make the developers aware, so they can include an error line that identifies an incorrect directory to the user. 


Discussion:
What do you mean by incorrect directory name? Inexistent one? 
Could you provide a small, easily [reproducible example ](http://sscce.org/)
```python
from obspy.io.xseed import Parser

dlseedpath = '/home/code/my_dlseedfile.dlseed'

parser = Parser(dlseedpath)
```

If you have a dlseed file in the above directory and change the file name to '123.dlseed', which doesn't exist, you'll get the error stated above, rather than an error indicating that the file directory does not exist.
I can confirm this, we (had?) similar misleading errors when trying lo load a non existent path with lxml (e.g. to read StationXML).

This should ideally be fixed by centralizing file opening, I think we should be able to use `_generic_reader()` function for this from `obspy.core.util.base`
See #2062 for a similar fix and we should reuse the same error message and exceptions as done there
I've started looking into resolving this issue.

Resolving patch:
diff --git a/obspy/io/xseed/parser.py b/obspy/io/xseed/parser.py
--- a/obspy/io/xseed/parser.py
+++ b/obspy/io/xseed/parser.py
@@ -172,9 +172,11 @@ def read(self, data):
             warnings.warn("Clearing parser before every subsequent read()")
             self.__init__()
         # try to transform everything into BytesIO object
+        potential_filename_provided = None
         if isinstance(data, (str, Path)):
             if isinstance(data, Path):
                 data = str(data)
+            potential_filename_provided = data
             if re.search(r"://", data) is not None:
                 url = data
                 data = io.BytesIO()
@@ -232,7 +234,11 @@ def read(self, data):
                 raise
             self._format = 'XSEED'
         else:
-            raise IOError("First byte of data must be in [0-9<]")
+            msg = "First byte of data must be in [0-9<]"
+            if potential_filename_provided is not None \
+                    and not os.path.exists(potential_filename_provided):
+                msg += '. If a filename was provided, the file does not exist.'
+            raise IOError(msg)
 
     def get_xseed(self, version=DEFAULT_XSEED_VERSION, split_stations=False):
         """


Test patch:
Repository: obspy/obspy

Issue:
AttributeError: 'ArtistList' object has no attribute 'remove' when "un-zooming" a stream plot
### Avoid duplicates

- [X] I searched existing issues

### Bug Summary

Minor but annoying bug when clicking the "home" button after zooming in on a plotted stream. The red `Warning: Zooming into MinMax Plot!` text in the corner isn't being cleared. Before I delve into it I figure someone may already be aware of whatever matplotlib (?) thing has changed. 

```
st.plot()

Installed gtk4 event loop hook.
Traceback (most recent call last):
  File "/home/seis/.local/lib/python3.11/site-packages/matplotlib/cbook/__init__.py", line 304, in process
    func(*args, **kwargs)
  File "/home/seis/.local/lib/python3.11/site-packages/obspy/imaging/waveform.py", line 1445, in _warn_on_xaxis_zoom
    self._remove_zoomlevel_warning_text()
  File "/home/seis/.local/lib/python3.11/site-packages/obspy/imaging/waveform.py", line 1457, in _remove_zoomlevel_warning_text
    ax.texts.remove(self._minmax_warning_text)
    ^^^^^^^^^^^^^^^
AttributeError: 'ArtistList' object has no attribute 'remove'
```


### Code to Reproduce

```python
1) st.plot()

2) zoom in with the magnifying glass

3) click the "home" icon to resume the original view
```


### Error Traceback

_No response_

### ObsPy Version?

1.4.0

### Operating System?

Debian 12

### Python Version?

3.11

### Installation Method?

pip


Discussion:
I've come across this API change in mpl 3.6 in megies/obspyck#104. Should be an easy fix. Thanks for the report!

Resolving patch:
diff --git a/obspy/imaging/waveform.py b/obspy/imaging/waveform.py
--- a/obspy/imaging/waveform.py
+++ b/obspy/imaging/waveform.py
@@ -34,6 +34,7 @@
 
 from obspy import Stream, Trace, UTCDateTime
 from obspy.core.util import create_empty_data_chunk
+from obspy.core.util.base import MATPLOTLIB_VERSION
 from obspy.geodetics import FlinnEngdahl, kilometer2degrees, locations2degrees
 from obspy.imaging.util import (_set_xaxis_obspy_dates, _id_key, _timestring)
 
@@ -1454,7 +1455,10 @@ def _add_zoomlevel_warning_text(self):
     def _remove_zoomlevel_warning_text(self):
         ax = self.fig.axes[0]
         if self._minmax_warning_text in ax.texts:
-            ax.texts.remove(self._minmax_warning_text)
+            if MATPLOTLIB_VERSION < [3, 6]:
+                ax.texts.remove(self._minmax_warning_text)
+            else:
+                self._minmax_warning_text.remove()
         self._minmax_warning_text = None
 
     def _draw_overlap_axvspans(self, st, ax):


Test patch:
Repository: obspy/obspy

Issue:
Possible typo on the documentation page of `obspy.signal.rotate.rotate_ne_rt`
On its documentation page: https://docs.obspy.org/packages/autogen/obspy.signal.rotate.rotate_rt_ne.html
the inputs of the `obspy.signal.rotate_rt_ne()` are shown as the north and east components, which should be the radial and transverse components instead. 


Discussion:

Resolving patch:
diff --git a/obspy/signal/rotate.py b/obspy/signal/rotate.py
--- a/obspy/signal/rotate.py
+++ b/obspy/signal/rotate.py
@@ -50,7 +50,7 @@ def rotate_ne_rt(n, e, ba):
     return r, t
 
 
-def rotate_rt_ne(n, e, ba):
+def rotate_rt_ne(r, t, ba):
     """
     Rotates horizontal components of a seismogram.
 
@@ -59,9 +59,15 @@ def rotate_rt_ne(n, e, ba):
 
     This is the inverse transformation of the transformation described
     in :func:`rotate_ne_rt`.
+
+    :type r: :class:`~numpy.ndarray`
+    :param r: Data of the Radial component of the seismogram.
+    :type t: :class:`~numpy.ndarray`
+    :param t: Data of the Transverse component of the seismogram.
+    :returns: North and East component of seismogram.
     """
     ba = 360.0 - ba
-    return rotate_ne_rt(n, e, ba)
+    return rotate_ne_rt(r, t, ba)
 
 
 def rotate_zne_lqt(z, n, e, ba, inc):


Test patch:
diff --git a/obspy/signal/tests/test_rotate.py b/obspy/signal/tests/test_rotate.py
--- a/obspy/signal/tests/test_rotate.py
+++ b/obspy/signal/tests/test_rotate.py
@@ -92,8 +92,8 @@ def test_rotate_ne_rt_ne(self, testdata):
         data_n = np.require(data_n, np.float64)
         data_e = np.require(data_e, np.float64)
         ba = 33.3
-        new_n, new_e = rotate_ne_rt(data_n, data_e, ba)
-        new_n, new_e = rotate_rt_ne(new_n, new_e, ba)
+        r, t = rotate_ne_rt(data_n, data_e, ba)
+        new_n, new_e = rotate_rt_ne(r, t, ba)
         assert np.allclose(data_n, new_n, rtol=1E-7, atol=1E-12)
         assert np.allclose(data_e, new_e, rtol=1E-7, atol=1E-12)
Repository: obspy/obspy

Issue:
Updated URL mapping for ISC data

The client for ISC data currently points to the mirror of the ISC database, formerly hosted by IRIS. As part of IRIS moving too EarthScope, and moving to cloud services, this mirror may soon be inaccessible. 

Propose simply changing the URL so the main ISC data base is queried, rather than the IRIS/EarthScope hosted mirror.

The URL mappings are currently set as;
```
URL_MAPPINGS['ISC'] = 'http://isc-mirror.iris.washington.edu/'
```
And should now probably be set as;
```
URL_MAPPINGS['ISC'] = 'http://www.isc.ac.uk/'
```


Discussion:

Resolving patch:
diff --git a/obspy/clients/fdsn/__init__.py b/obspy/clients/fdsn/__init__.py
--- a/obspy/clients/fdsn/__init__.py
+++ b/obspy/clients/fdsn/__init__.py
@@ -48,10 +48,10 @@
 IPGP        http://ws.ipgp.fr
 IRIS        http://service.iris.edu
 IRISPH5     http://service.iris.edu
-ISC         http://isc-mirror.iris.washington.edu
+ISC         http://www.isc.ac.uk
 KNMI        http://rdsa.knmi.nl
 KOERI       http://eida.koeri.boun.edu.tr
-LMU         http://erde.geophysik.uni-muenchen.de
+LMU         https://erde.geophysik.uni-muenchen.de
 NCEDC       http://service.ncedc.org
 NIEP        http://eida-sc3.infp.ro
 NOA         http://eida.gein.noa.gr
diff --git a/obspy/clients/fdsn/header.py b/obspy/clients/fdsn/header.py
--- a/obspy/clients/fdsn/header.py
+++ b/obspy/clients/fdsn/header.py
@@ -114,10 +114,10 @@ class FDSNNoServiceException(FDSNException):
     "IPGP": "http://ws.ipgp.fr",
     "IRIS": "http://service.iris.edu",
     "IRISPH5": "http://service.iris.edu",
-    "ISC": "http://isc-mirror.iris.washington.edu",
+    "ISC": "http://www.isc.ac.uk",
     "KNMI": "http://rdsa.knmi.nl",
     "KOERI": "http://eida.koeri.boun.edu.tr",
-    "LMU": "http://erde.geophysik.uni-muenchen.de",
+    "LMU": "https://erde.geophysik.uni-muenchen.de",
     "NCEDC": "https://service.ncedc.org",
     "NIEP": "http://eida-sc3.infp.ro",
     "NOA": "http://eida.gein.noa.gr",


Test patch:
Repository: obspy/obspy

Issue:
peak_ground_motion description
Sorry this is a minor thing - I believe the description line of the obspy.signal.freqattributes.peak_ground_motion
function is not correct:
https://github.com/obspy/obspy/blob/master/obspy/signal/freqattributes.py#L376

standard frequencies for ShakeMaps are 0.3/1.0/3.0 Hz

where these are in fact periods: 0.3s, 1s and 3s


Discussion:
Probably that docstring was specified with Hertz to stay in line with the argument of the function call using Hertz.. not sure. I think we can leave it like this? Is there an agreed upon convention for frequencies/periods for shake maps somewhere? In any case this seems indeed like a very small difference to me
@megies you can see the standard periods here: [see figure 8](https://usgs.github.io/shakemap/manual4_0/tg_processing.html).

Resolving patch:
diff --git a/obspy/signal/freqattributes.py b/obspy/signal/freqattributes.py
--- a/obspy/signal/freqattributes.py
+++ b/obspy/signal/freqattributes.py
@@ -372,8 +372,9 @@ def peak_ground_motion(data, delta, freq, damp=0.1):
     Peak ground motion parameters
 
     Compute the maximal displacement, velocity, acceleration and the peak
-    ground acceleration at a certain frequency (standard frequencies for
-    ShakeMaps are 0.3/1.0/3.0 Hz).
+    ground acceleration at a certain frequency (standard periods for
+    ShakeMaps are 0.3/1.0/3.0 seconds. Note that the above input is expected as
+    frequency in Hertz.).
 
     Data must be displacement
 


Test patch:
Repository: ultralytics/ultralytics

Issue:
Tune weights dir will always be `last.pt`
### Search before asking

- [X] I have searched the YOLOv8 [issues](https://github.com/ultralytics/ultralytics/issues) and found no similar bug report.


### YOLOv8 Component

Hyperparameter Tuning

### Bug

When tuning the weights in `last.pt` will always be chosen. This is because [This line](https://github.com/ultralytics/ultralytics/blob/e45146f25d68fbb3d744c180e3f615653ce1be99/ultralytics/engine/tuner.py#L191) of code is run before the subprocess to run a training run is started, so `best.pt` will never exist, therefore `ckpt_file` will always point to `last.pt`

### Environment

_No response_

### Minimal Reproducible Example

_No response_

### Additional

_No response_

### Are you willing to submit a PR?

- [X] Yes I'd like to help by submitting a PR!


Discussion:

Resolving patch:
diff --git a/ultralytics/engine/tuner.py b/ultralytics/engine/tuner.py
--- a/ultralytics/engine/tuner.py
+++ b/ultralytics/engine/tuner.py
@@ -188,11 +188,11 @@ def __call__(self, model=None, iterations=10, cleanup=True):
             train_args = {**vars(self.args), **mutated_hyp}
             save_dir = get_save_dir(get_cfg(train_args))
             weights_dir = save_dir / "weights"
-            ckpt_file = weights_dir / ("best.pt" if (weights_dir / "best.pt").exists() else "last.pt")
             try:
                 # Train YOLO model with mutated hyperparameters (run in subprocess to avoid dataloader hang)
                 cmd = ["yolo", "train", *(f"{k}={v}" for k, v in train_args.items())]
                 return_code = subprocess.run(cmd, check=True).returncode
+                ckpt_file = weights_dir / ("best.pt" if (weights_dir / "best.pt").exists() else "last.pt")
                 metrics = torch.load(ckpt_file)["train_metrics"]
                 assert return_code == 0, "training failed"
 


Test patch:
Repository: horovod/horovod

Issue:
Error on using hvd.mpi_threads_supported()  error: undefined symbol: mpi_threads_supported
Error on using hvd.mpi_threads_supported() 

error: undefined symbol: mpi_threads_supported

`mpi_threads_supported = MPI_COMMON_LIB_CTYPES.mpi_threads_supported()`
 should be 
`mpi_threads_supported = MPI_COMMON_LIB_CTYPES.horovod_mpi_threads_supported()`



Discussion:

Resolving patch:
diff --git a/horovod/common/__init__.py b/horovod/common/__init__.py
--- a/horovod/common/__init__.py
+++ b/horovod/common/__init__.py
@@ -107,7 +107,7 @@ def mpi_threads_supported():
     Returns:
       A boolean value indicating whether MPI multi-threading is supported.
     """
-    mpi_threads_supported = MPI_COMMON_LIB_CTYPES.mpi_threads_supported()
+    mpi_threads_supported = MPI_COMMON_LIB_CTYPES.horovod_mpi_threads_supported()
     if mpi_threads_supported == -1:
         raise ValueError(
             'Horovod has not been initialized; use hvd.init().')


Test patch:
Repository: horovod/horovod

Issue:
'float' object has no attribute 'detach' in pytorch imagenet example.
I ran the [pytorch imagenet example](https://github.com/horovod/horovod/blob/master/examples/pytorch_imagenet_resnet50.py) but got an error that `float` number don't have `detach()` method. It seems that `loss.item()` lead to the `float` number, but I don't know how to fix that in `horovod` framework. 

Can anyone help me? Thanks a lot!

```
mpirun -np 4 \
  -H localhost:4 \
  -bind-to none -map-by slot \
  -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x PATH \
  -mca pml ob1 -mca btl ^openib \
  python main_hvd.py --train-dir /datasets/ILSVRC2012/images/train --val-dir /datasets/ILSVRC2012/images/val
```

```
Train Epoch     #1:   0%|          | 0/10010 [00:00<?, ?it/s]Traceback (most recent call last):
  File "main_hvd.py", line 272, in <module>
    train(epoch)
  File "main_hvd.py", line 179, in train
    train_loss.update(loss.item())
  File "main_hvd.py", line 263, in update
    self.sum += hvd.allreduce(val.detach().cpu(), name=self.name)
AttributeError: 'float' object has no attribute 'detach'
```

My environment is:
* pytorch==0.4.1
* horovod==0.16.0


Discussion:

Resolving patch:
diff --git a/examples/pytorch_imagenet_resnet50.py b/examples/pytorch_imagenet_resnet50.py
--- a/examples/pytorch_imagenet_resnet50.py
+++ b/examples/pytorch_imagenet_resnet50.py
@@ -176,7 +176,7 @@ def train(epoch):
                 output = model(data_batch)
                 train_accuracy.update(accuracy(output, target_batch))
                 loss = F.cross_entropy(output, target_batch)
-                train_loss.update(loss.item())
+                train_loss.update(loss)
                 # Average gradients among sub-batches
                 loss.div_(math.ceil(float(len(data)) / args.batch_size))
                 loss.backward()


Test patch:
Repository: horovod/horovod

Issue:
Replace .step(synchronize=False) with optimizer.skip_synchronize()
NVIDIA AMP does not support passing additional flags to `optimizer.step()`, such as `optimizer.step(synchronize=False)`.

This PR switches API to use context manager:
```python
optimizer.synchronize()
with optimizer.skip_synchronize():
    optimizer.step()
```


Discussion:
New interface LGTM. Shall we keep the old interface for backward compatibility and raise a warning and remove it in a later release? 
@abditag2, I'm debating that, since the API was released a couple of days ago and it does not work for the only user who asked for it. Seems less confusing to just hard-migrate to a new API at this point.
Sounds good then!

Resolving patch:
diff --git a/horovod/__init__.py b/horovod/__init__.py
--- a/horovod/__init__.py
+++ b/horovod/__init__.py
@@ -1 +1 @@
-__version__ = '0.16.3'
+__version__ = '0.16.4'


Test patch:
Repository: horovod/horovod

Issue:
terminate called after throwing an instance of 'gloo::EnforceNotMet'   ifa != nullptr. Unable to find address for: eth0
hvd.init() throws following error
```
>>> hvd.init()
terminate called after throwing an instance of 'gloo::EnforceNotMet'
  what():  [enforce fail at /tmp/pip-install-3dvzdqhs/horovod/third_party/gloo/gloo/transport/tcp/device.cc:88] ifa != nullptr. Unable to find address for: eth0
Aborted
```
What I understand is that gloo is hardcoded to check for eth0 and in my case (Centos 7.6) I have em1 and em2. I came acrros solution to export the below env variables but i am still seeing the issue
```
export GLOO_SOCKET_IFNAME=em2
export NCCL_SOCKET_IFNAME=em2
```
How can I get pass this?

**Environment:**
Framework:  Keras
Tensorflow Version 1.13.1
Keras Version 2.2.4-tf
Horovod version: horovod==0.17.0.post1
Python version: 3.6



Discussion:
Hey @khayamgondal, can you try setting `HOROVOD_GLOO_IFACE=em2` instead?  Apologies that this is not better documented, I'll add some docs to explain this (and perhaps we can even auto-detect this similar to how we do it for MPI).
Thanks @tgaddair, If its a minor issue in the code, I can try to fix it. 
Like I said, it's just another environment variable you need to set:

```
export HOROVOD_GLOO_IFACE=em2
```

Let me know if that works.

Resolving patch:
diff --git a/horovod/run/gloo_run.py b/horovod/run/gloo_run.py
--- a/horovod/run/gloo_run.py
+++ b/horovod/run/gloo_run.py
@@ -221,7 +221,7 @@ def gloo_run(settings, remote_host_names, common_intfs):
         'HOROVOD_GLOO_RENDEZVOUS_PORT={port} '
         'HOROVOD_CONTROLLER=gloo '
         'HOROVOD_CPU_OPERATIONS=gloo '
-        'HOROVOD_IFACE={iface} '
+        'HOROVOD_GLOO_IFACE={iface} '
         'NCCL_SOCKET_IFNAME={common_intfs} '
         '{command}'  # expect a lot of environment variables
         .format(addr=server_ip,


Test patch: